{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Normal, Ledoit-Wolf and OAS Linear Discriminant Analysis for classification\n\nThis example illustrates how the Ledoit-Wolf and Oracle Approximating\nShrinkage (OAS) estimators of covariance can improve classification.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Authors: The scikit-learn developers\n# SPDX-License-Identifier: BSD-3-Clause\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nfrom sklearn.covariance import OAS\nfrom sklearn.datasets import make_blobs\nfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n\nn_train = 20 # samples for training\nn_test = 200 # samples for testing\nn_averages = 50 # how often to repeat classification\nn_features_max = 75 # maximum number of features\nstep = 4 # step size for the calculation\n\n\ndef generate_data(n_samples, n_features):\n \"\"\"Generate random blob-ish data with noisy features.\n\n This returns an array of input data with shape `(n_samples, n_features)`\n and an array of `n_samples` target labels.\n\n Only one feature contains discriminative information, the other features\n contain only noise.\n \"\"\"\n X, y = make_blobs(n_samples=n_samples, n_features=1, centers=[[-2], [2]])\n\n # add non-discriminative features\n if n_features > 1:\n X = np.hstack([X, np.random.randn(n_samples, n_features - 1)])\n return X, y\n\n\nacc_clf1, acc_clf2, acc_clf3 = [], [], []\nn_features_range = range(1, n_features_max + 1, step)\nfor n_features in n_features_range:\n score_clf1, score_clf2, score_clf3 = 0, 0, 0\n for _ in range(n_averages):\n X, y = generate_data(n_train, n_features)\n\n clf1 = LinearDiscriminantAnalysis(solver=\"lsqr\", shrinkage=None).fit(X, y)\n clf2 = LinearDiscriminantAnalysis(solver=\"lsqr\", shrinkage=\"auto\").fit(X, y)\n oa = OAS(store_precision=False, assume_centered=False)\n clf3 = LinearDiscriminantAnalysis(solver=\"lsqr\", covariance_estimator=oa).fit(\n X, y\n )\n\n X, y = generate_data(n_test, n_features)\n score_clf1 += clf1.score(X, y)\n score_clf2 += clf2.score(X, y)\n score_clf3 += clf3.score(X, y)\n\n acc_clf1.append(score_clf1 / n_averages)\n acc_clf2.append(score_clf2 / n_averages)\n acc_clf3.append(score_clf3 / n_averages)\n\nfeatures_samples_ratio = np.array(n_features_range) / n_train\n\nplt.plot(\n features_samples_ratio,\n acc_clf1,\n linewidth=2,\n label=\"LDA\",\n color=\"gold\",\n linestyle=\"solid\",\n)\nplt.plot(\n features_samples_ratio,\n acc_clf2,\n linewidth=2,\n label=\"LDA with Ledoit Wolf\",\n color=\"navy\",\n linestyle=\"dashed\",\n)\nplt.plot(\n features_samples_ratio,\n acc_clf3,\n linewidth=2,\n label=\"LDA with OAS\",\n color=\"red\",\n linestyle=\"dotted\",\n)\n\nplt.xlabel(\"n_features / n_samples\")\nplt.ylabel(\"Classification accuracy\")\n\nplt.legend(loc=\"lower left\")\nplt.ylim((0.65, 1.0))\nplt.suptitle(\n \"LDA (Linear Discriminant Analysis) vs. \"\n + \"\\n\"\n + \"LDA with Ledoit Wolf vs. \"\n + \"\\n\"\n + \"LDA with OAS (1 discriminative feature)\"\n)\nplt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.21" } }, "nbformat": 4, "nbformat_minor": 0 }