From 50d5c8b426ad807cd3f264275e401a8f87bee699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Geron?= Date: Wed, 4 Apr 2018 11:49:00 +0200 Subject: [PATCH] Add clustering, density estimation and anomaly detection to chapter 8 --- 08_dimensionality_reduction.ipynb | 3222 ++++++++++++++++- .../README | 0 images/unsupervised_learning/ladybug.png | Bin 0 -> 574484 bytes 3 files changed, 3103 insertions(+), 119 deletions(-) rename images/{dim_reduction => unsupervised_learning}/README (100%) create mode 100644 images/unsupervised_learning/ladybug.png diff --git a/08_dimensionality_reduction.ipynb b/08_dimensionality_reduction.ipynb index 5f0de13..a1c15e9 100644 --- a/08_dimensionality_reduction.ipynb +++ b/08_dimensionality_reduction.ipynb @@ -4,14 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Chapter 8 – Dimensionality Reduction**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "_This notebook contains all the sample code and solutions to the exercises in chapter 8._" + "**Chapter 8 – Dimensionality Reduction** (1st edition)\n", + "\n", + "**Chapter 8 – Unsupervised Learning** (2nd edition)\n", + "\n", + "_The upcoming second edition of the book extends this chapter to cover not only dimensionality reduction, but also clustering, density estimation and anomaly detection. This notebook contains all sample code and solutions to the exercises of both editions._" ] }, { @@ -54,14 +51,18 @@ "\n", "# Where to save the figures\n", "PROJECT_ROOT_DIR = \".\"\n", - "CHAPTER_ID = \"dim_reduction\"\n", + "CHAPTER_ID = \"unsupervised_learning\"\n", "\n", "def save_fig(fig_id, tight_layout=True):\n", " path = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID, fig_id + \".png\")\n", " print(\"Saving figure\", fig_id)\n", " if tight_layout:\n", " plt.tight_layout()\n", - " plt.savefig(path, format='png', dpi=300)" + " plt.savefig(path, format='png', dpi=300)\n", + "\n", + "# Ignore useless warnings (see SciPy issue #5998)\n", + "import warnings\n", + "warnings.filterwarnings(action=\"ignore\", module=\"scipy\", message=\"^internal gelsd\")" ] }, { @@ -1301,9 +1302,7 @@ { "cell_type": "code", "execution_count": 62, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "rbf_pca = KernelPCA(n_components = 2, kernel=\"rbf\", gamma=0.0433,\n", @@ -1333,9 +1332,7 @@ { "cell_type": "code", "execution_count": 64, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "X, t = make_swiss_roll(n_samples=1000, noise=0.2, random_state=41)" @@ -1344,9 +1341,7 @@ { "cell_type": "code", "execution_count": 65, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "from sklearn.manifold import LocallyLinearEmbedding\n", @@ -1382,9 +1377,7 @@ { "cell_type": "code", "execution_count": 67, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "from sklearn.manifold import MDS\n", @@ -1396,9 +1389,7 @@ { "cell_type": "code", "execution_count": 68, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "from sklearn.manifold import Isomap\n", @@ -1410,9 +1401,7 @@ { "cell_type": "code", "execution_count": 69, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "from sklearn.manifold import TSNE\n", @@ -1460,6 +1449,3042 @@ "plt.show()" ] }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [], + "source": [ + "def learned_parameters(model):\n", + " return [m for m in dir(model)\n", + " if m.endswith(\"_\") and not m.startswith(\"_\")]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Clustering" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introdution – Classification _vs_ Clustering" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.datasets import load_iris" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [], + "source": [ + "data = load_iris()\n", + "X = data.data\n", + "y = data.target\n", + "data.target_names" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(9, 3.5))\n", + "\n", + "plt.subplot(121)\n", + "plt.plot(X[y==0, 0], X[y==0, 1], \"yo\", label=\"Iris-Setosa\")\n", + "plt.plot(X[y==1, 0], X[y==1, 1], \"bs\", label=\"Iris-Versicolor\")\n", + "plt.plot(X[y==2, 0], X[y==2, 1], \"g^\", label=\"Iris-Virginica\")\n", + "plt.xlabel(\"Petal length\", fontsize=14)\n", + "plt.ylabel(\"Petal width\", fontsize=14)\n", + "plt.legend(fontsize=12)\n", + "\n", + "plt.subplot(122)\n", + "plt.scatter(X[:, 0], X[:, 1], c=\"k\", marker=\".\")\n", + "plt.xlabel(\"Petal length\", fontsize=14)\n", + "plt.tick_params(labelleft='off')\n", + "\n", + "save_fig(\"classification_vs_clustering_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A Gaussian mixture model (explained below) can actually separate these clusters pretty well." + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.mixture import GaussianMixture" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [], + "source": [ + "y_pred = GaussianMixture(n_components=3, random_state=42).fit(X).predict(X)\n", + "mapping = np.array([2, 0, 1])\n", + "y_pred = np.array([mapping[cluster_id] for cluster_id in y_pred])" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(X[y_pred==0, 0], X[y_pred==0, 1], \"yo\", label=\"Cluster 1\")\n", + "plt.plot(X[y_pred==1, 0], X[y_pred==1, 1], \"bs\", label=\"Cluster 2\")\n", + "plt.plot(X[y_pred==2, 0], X[y_pred==2, 1], \"g^\", label=\"Cluster 3\")\n", + "plt.xlabel(\"Petal length\", fontsize=14)\n", + "plt.ylabel(\"Petal width\", fontsize=14)\n", + "plt.legend(loc=\"upper right\", fontsize=12)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [], + "source": [ + "np.sum(y_pred==y)" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [], + "source": [ + "np.sum(y_pred==y) / len(y_pred)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## K-Means" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's start by generating some blobs:" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.datasets import make_blobs" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [], + "source": [ + "blob_centers = np.array(\n", + " [[ 0.2, 2.3],\n", + " [-1.5 , 2.3],\n", + " [-2.8, 1.8],\n", + " [-2.8, 2.8],\n", + " [-2.8, 1.3]])\n", + "blob_std = np.array([0.4, 0.3, 0.1, 0.1, 0.1])" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [], + "source": [ + "X, y = make_blobs(n_samples=2000, centers=blob_centers,\n", + " cluster_std=blob_std, random_state=7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's plot them:" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_clusters(X, y=None):\n", + " plt.scatter(X[:, 0], X[:, 1], c=y, s=1)\n", + " plt.xlabel(\"$x_1$\", fontsize=14)\n", + " plt.ylabel(\"$x_2$\", fontsize=14, rotation=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8, 4))\n", + "plot_clusters(X)\n", + "save_fig(\"blobs_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fit and Predict" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's train a K-Means clusterer on this dataset. It will try to find each blob's center and assign each instance to the closest blob:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.cluster import KMeans" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "k = 5\n", + "kmeans = KMeans(n_clusters=k, random_state=42)\n", + "y_pred = kmeans.fit_predict(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each instance was assigned to one of the 5 clusters:" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [], + "source": [ + "y_pred" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [], + "source": [ + "y_pred is kmeans.labels_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the following 5 _centroids_ (i.e., cluster centers) were estimated:" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans.cluster_centers_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the `KMeans` instance preserves the labels of the instances it was trained on. Somewhat confusingly, in this context, the _label_ of an instance is the index of the cluster that instance gets assigned to:" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans.labels_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course, we can predict the labels of new instances:" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [], + "source": [ + "X_new = np.array([[0, 2], [3, 2], [-3, 3], [-3, 2.5]])\n", + "kmeans.predict(X_new)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Decision Boundaries" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's plot the model's decision boundaries. This gives us a _Voronoi diagram_:" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_data(X):\n", + " plt.plot(X[:, 0], X[:, 1], 'k.', markersize=2)\n", + "\n", + "def plot_centroids(centroids, weights=None, circle_color='w', cross_color='k'):\n", + " if weights is not None:\n", + " centroids = centroids[weights > weights.max() / 10]\n", + " plt.scatter(centroids[:, 0], centroids[:, 1],\n", + " marker='o', s=30, linewidths=8,\n", + " color=circle_color, zorder=10, alpha=0.9)\n", + " plt.scatter(centroids[:, 0], centroids[:, 1],\n", + " marker='x', s=50, linewidths=50,\n", + " color=cross_color, zorder=11, alpha=1)\n", + "\n", + "def plot_decision_boundaries(clusterer, X, resolution=1000, show_centroids=True,\n", + " show_xlabels=True, show_ylabels=True):\n", + " mins = X.min(axis=0) - 0.1\n", + " maxs = X.max(axis=0) + 0.1\n", + " xx, yy = np.meshgrid(np.linspace(mins[0], maxs[0], resolution),\n", + " np.linspace(mins[1], maxs[1], resolution))\n", + " Z = clusterer.predict(np.c_[xx.ravel(), yy.ravel()])\n", + " Z = Z.reshape(xx.shape)\n", + "\n", + " plt.contourf(Z, extent=(mins[0], maxs[0], mins[1], maxs[1]),\n", + " cmap=\"Pastel2\")\n", + " plt.contour(Z, extent=(mins[0], maxs[0], mins[1], maxs[1]),\n", + " linewidths=1, colors='k')\n", + " plot_data(X)\n", + " if show_centroids:\n", + " plot_centroids(clusterer.cluster_centers_)\n", + "\n", + " if show_xlabels:\n", + " plt.xlabel(\"$x_1$\", fontsize=14)\n", + " else:\n", + " plt.tick_params(labelbottom='off')\n", + " if show_ylabels:\n", + " plt.ylabel(\"$x_2$\", fontsize=14, rotation=0)\n", + " else:\n", + " plt.tick_params(labelleft='off')" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8, 4))\n", + "plot_decision_boundaries(kmeans, X)\n", + "save_fig(\"voronoi_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Not bad! Some of the instances near the edges were probably assigned to the wrong cluster, but overall it looks pretty good." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Hard Clustering _vs_ Soft Clustering" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rather than arbitrarily choosing the closest cluster for each instance, which is called _hard clustering_, it might be better measure the distance of each instance to all 5 centroids. This is what the `transform()` method does:" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans.transform(X_new)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can verify that this is indeed the Euclidian distance between each instance and each centroid:" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [], + "source": [ + "np.linalg.norm(np.tile(X_new, (1, k)).reshape(-1, k, 2) - kmeans.cluster_centers_, axis=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### K-Means Algorithm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The K-Means algorithm is one of the fastest clustering algorithms, but also one of the simplest:\n", + "* First initialize $k$ centroids randomly: $k$ distinct instances are chosen randomly from the dataset and the centroids are placed at their locations.\n", + "* Repeat until convergence (i.e., until the centroids stop moving):\n", + " * Assign each instance to the closest centroid.\n", + " * Update the centroids to be the mean of the instances that are assigned to them." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `KMeans` class applies an optimized algorithm by default. To get the original K-Means algorithm (for educational purposes only), you must set `init=\"random\"`, `n_init=1`and `algorithm=\"full\"`. These hyperparameters will be explained below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's run the K-Means algorithm for 1, 2 and 3 iterations, to see how the centroids move around:" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans_iter1 = KMeans(n_clusters=5, init=\"random\", n_init=1,\n", + " algorithm=\"full\", max_iter=1, random_state=1)\n", + "kmeans_iter2 = KMeans(n_clusters=5, init=\"random\", n_init=1,\n", + " algorithm=\"full\", max_iter=2, random_state=1)\n", + "kmeans_iter3 = KMeans(n_clusters=5, init=\"random\", n_init=1,\n", + " algorithm=\"full\", max_iter=3, random_state=1)\n", + "kmeans_iter1.fit(X)\n", + "kmeans_iter2.fit(X)\n", + "kmeans_iter3.fit(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And let's plot this:" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(10, 8))\n", + "\n", + "plt.subplot(321)\n", + "plot_data(X)\n", + "plot_centroids(kmeans_iter1.cluster_centers_, circle_color='r', cross_color='w')\n", + "plt.ylabel(\"$x_2$\", fontsize=14, rotation=0)\n", + "plt.tick_params(labelbottom='off')\n", + "plt.title(\"Update the centroids (initially randomly)\", fontsize=14)\n", + "\n", + "plt.subplot(322)\n", + "plot_decision_boundaries(kmeans_iter1, X, show_xlabels=False, show_ylabels=False)\n", + "plt.title(\"Label the instances\", fontsize=14)\n", + "\n", + "plt.subplot(323)\n", + "plot_decision_boundaries(kmeans_iter1, X, show_centroids=False, show_xlabels=False)\n", + "plot_centroids(kmeans_iter2.cluster_centers_)\n", + "\n", + "plt.subplot(324)\n", + "plot_decision_boundaries(kmeans_iter2, X, show_xlabels=False, show_ylabels=False)\n", + "\n", + "plt.subplot(325)\n", + "plot_decision_boundaries(kmeans_iter2, X, show_centroids=False)\n", + "plot_centroids(kmeans_iter3.cluster_centers_)\n", + "\n", + "plt.subplot(326)\n", + "plot_decision_boundaries(kmeans_iter3, X, show_ylabels=False)\n", + "\n", + "save_fig(\"kmeans_algorithm_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### K-Means Variability" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the original K-Means algorithm, the centroids are just initialized randomly, and the algorithm simply runs a single iteration to gradually improve the centroids, as we saw above.\n", + "\n", + "However, one major problem with this approach is that if you run K-Means multiple times (or with different random seeds), it can converge to very different solutions, as you can see below:" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_clusterer_comparison(clusterer1, clusterer2, X, title1=None, title2=None):\n", + " clusterer1.fit(X)\n", + " clusterer2.fit(X)\n", + "\n", + " plt.figure(figsize=(10, 3.2))\n", + "\n", + " plt.subplot(121)\n", + " plot_decision_boundaries(clusterer1, X)\n", + " if title1:\n", + " plt.title(title1, fontsize=14)\n", + "\n", + " plt.subplot(122)\n", + " plot_decision_boundaries(clusterer2, X, show_ylabels=False)\n", + " if title2:\n", + " plt.title(title2, fontsize=14)" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans_rnd_init1 = KMeans(n_clusters=5, init=\"random\", n_init=1,\n", + " algorithm=\"full\", random_state=11)\n", + "kmeans_rnd_init2 = KMeans(n_clusters=5, init=\"random\", n_init=1,\n", + " algorithm=\"full\", random_state=19)\n", + "\n", + "plot_clusterer_comparison(kmeans_rnd_init1, kmeans_rnd_init2, X,\n", + " \"Solution 1\", \"Solution 2 (with a different random init)\")\n", + "\n", + "save_fig(\"kmeans_variability_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Inertia" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To select the best model, we will need a way to evaluate a K-Mean model's performance. Unfortunately, clustering is an unsupervised task, so we do not have the targets. But at least we can measure the distance between each instance and its centroid. This is the idea behind the _inertia_ metric:" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans.inertia_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can easily verify, inertia is the sum of the squared distances between each training instance and its closest centroid:" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [], + "source": [ + "X_dist = kmeans.transform(X)\n", + "np.sum(X_dist[np.arange(len(X_dist)), kmeans.labels_]**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `score()` method returns the negative inertia. Why negative? Well, it is because a predictor's `score()` method must always respect the \"_great is better_\" rule." + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans.score(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multiple Initializations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So one approach to solve the variability issue is to simply run the K-Means algorithm multiple times with different random initializations, and select the solution that minimizes the inertia. For example, here are the inertias of the two \"bad\" models shown in the previous figure:" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans_rnd_init1.inertia_" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans_rnd_init2.inertia_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, they have a higher inertia than the first \"good\" model we trained, which means they are probably worse." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you set the `n_init` hyperparameter, Scikit-Learn runs the original algorithm `n_init` times, and selects the solution that minimizes the inertia. By default, Scikit-Learn sets `n_init=10`." + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans_rnd_10_inits = KMeans(n_clusters=5, init=\"random\", n_init=10,\n", + " algorithm=\"full\", random_state=11)\n", + "kmeans_rnd_10_inits.fit(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, we end up with the initial model, which is certainly the optimal K-Means solution (at least in terms of inertia, and assuming $k=5$)." + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8, 4))\n", + "plot_decision_boundaries(kmeans_rnd_10_inits, X)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### K-Means++" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Instead of initializing the centroids entirely randomly, it is preferable to initialize them using the following algorithm, proposed in a [2006 paper](https://goo.gl/eNUPw6) by David Arthur and Sergei Vassilvitskii:\n", + "* Take one centroid $c_1$, chosen uniformly at random from the dataset.\n", + "* Take a new center $c_i$, choosing an instance $\\mathbf{x}_i$ with probability: $D(\\mathbf{x}_i)^2$ / $\\sum\\limits_{j=1}^{m}{D(\\mathbf{x}_j)}^2$ where $D(\\mathbf{x}_i)$ is the distance between the instance $\\mathbf{x}_i$ and the closest centroid that was already chosen. This probability distribution ensures that instances that are further away from already chosen centroids are much more likely be selected as centroids.\n", + "* Repeat the previous step until all $k$ centroids have been chosen." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The rest of the K-Means++ algorithm is just regular K-Means. With this initialization, the K-Means algorithm is much less likely to converge to a suboptimal solution, so it is possible to reduce `n_init` considerably. Most of the time, this largely compensates for the additional complexity of the initialization process." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To set the initialization to K-Means++, simply set `init=\"k-means++\"` (this is actually the default):" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [], + "source": [ + "KMeans()" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [], + "source": [ + "good_init = np.array([[-3, 3], [-3, 2], [-3, 1], [-1, 2], [0, 2]])\n", + "kmeans = KMeans(n_clusters=5, init=good_init, n_init=1, random_state=42)\n", + "kmeans.fit(X)\n", + "kmeans.inertia_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Accelerated K-Means" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The K-Means algorithm can be significantly accelerated by avoiding many unnecessary distance calculations: this is achieved by exploiting the triangle inequality (given three points A, B and C, the distance AC is always such that AC ≤ AB + BC) and by keeping track of lower and upper bounds for distances between instances and centroids (see this [2003 paper](https://www.aaai.org/Papers/ICML/2003/ICML03-022.pdf) by Charles Elkan for more details)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To use Elkan's variant of K-Means, just set `algorithm=\"elkan\"`. Note that it does not support sparse data, so by default, Scikit-Learn uses `\"elkan\"` for dense data, and `\"full\"` (the regular K-Means algorithm) for sparse data." + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, + "outputs": [], + "source": [ + "%timeit -n 50 KMeans(algorithm=\"elkan\").fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "%timeit -n 50 KMeans(algorithm=\"full\").fit(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Mini-Batch K-Means" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Scikit-Learn also implements a variant of the K-Means algorithm that supports mini-batches (see [this paper](http://www.eecs.tufts.edu/~dsculley/papers/fastkmeans.pdf)):" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.cluster import MiniBatchKMeans" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [], + "source": [ + "minibatch_kmeans = MiniBatchKMeans(n_clusters=5, random_state=42)\n", + "minibatch_kmeans.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [], + "source": [ + "minibatch_kmeans.inertia_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the dataset does not fit in memory, the simplest option is to use the `memmap` class, just like we did for incremental PCA:" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [], + "source": [ + "filename = \"my_mnist.data\"\n", + "m, n = 50000, 28*28\n", + "X_mm = np.memmap(filename, dtype=\"float32\", mode=\"readonly\", shape=(m, n))" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "minibatch_kmeans = MiniBatchKMeans(n_clusters=10, batch_size=10, random_state=42)\n", + "minibatch_kmeans.fit(X_mm)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If your data is so large that you cannot use `memmap`, things get more complicated. Let's start by writing a function to load the next batch (in real life, you would load the data from disk):" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [], + "source": [ + "def load_next_batch(batch_size):\n", + " return X[np.random.choice(len(X), batch_size, replace=False)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can train the model by feeding it one batch at a time. We also need to implement multiple initializations and keep the model with the lowest inertia:" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [], + "source": [ + "np.random.seed(42)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [], + "source": [ + "k = 5\n", + "n_init = 10\n", + "n_iterations = 100\n", + "batch_size = 100\n", + "init_size = 500 # more data for K-Means++ initialization\n", + "evaluate_on_last_n_iters = 10\n", + "\n", + "best_kmeans = None\n", + "\n", + "for init in range(n_init):\n", + " minibatch_kmeans = MiniBatchKMeans(n_clusters=k, init_size=init_size)\n", + " X_init = load_next_batch(init_size)\n", + " minibatch_kmeans.partial_fit(X_init)\n", + "\n", + " minibatch_kmeans.sum_inertia_ = 0\n", + " for iteration in range(n_iterations):\n", + " X_batch = load_next_batch(batch_size)\n", + " minibatch_kmeans.partial_fit(X_batch)\n", + " if iteration >= n_iterations - evaluate_on_last_n_iters:\n", + " minibatch_kmeans.sum_inertia_ += minibatch_kmeans.inertia_\n", + "\n", + " if (best_kmeans is None or\n", + " minibatch_kmeans.sum_inertia_ < best_kmeans.sum_inertia_):\n", + " best_kmeans = minibatch_kmeans" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "best_kmeans.score(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Mini-batch K-Means is much faster than regular K-Means:" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [], + "source": [ + "%timeit KMeans(n_clusters=5).fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [], + "source": [ + "%timeit MiniBatchKMeans(n_clusters=5).fit(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's *much* faster! However, its performance is often lower (higher inertia), and it keeps degrading as _k_ increases. Let's plot the inertia ratio and the training time ratio between Mini-batch K-Means and regular K-Means:" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [], + "source": [ + "from timeit import timeit" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [], + "source": [ + "inertia_ratios = []\n", + "time_ratios = []\n", + "for k in range(1, 100):\n", + " kmeans = KMeans(n_clusters=k, random_state=42)\n", + " minibatch_kmeans = MiniBatchKMeans(n_clusters=k, random_state=42)\n", + " print(\"\\r{}/{}\".format(k + 1, 100), end=\"\")\n", + " time_kmeans = timeit(\"kmeans.fit(X)\", number=10, globals=globals())\n", + " time_minibatch_kmeans = timeit(\"minibatch_kmeans.fit(X)\", number=10, globals=globals())\n", + " inertia_ratios.append(minibatch_kmeans.inertia_ / kmeans.inertia_)\n", + " time_ratios.append(time_minibatch_kmeans / time_kmeans)" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import LinearRegression" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "plt.figure(figsize=(10,4))\n", + "\n", + "lin_reg_inertia = LinearRegression()\n", + "lin_reg_time = LinearRegression()\n", + "lin_reg_inertia.fit(np.arange(1, 100).reshape(-1, 1), inertia_ratios)\n", + "lin_reg_time.fit(np.arange(1, 100).reshape(-1, 1), time_ratios)\n", + "\n", + "plt.subplot(121)\n", + "plt.plot(range(1, 100), inertia_ratios, \"bo\")\n", + "plt.plot([0, 100], [1.0, 1.0], \"r--\")\n", + "plt.plot([0, 100], lin_reg_inertia.predict([[0], [100]]), \"k-\")\n", + "plt.xlabel(\"$k$\", fontsize=16)\n", + "plt.ylabel(\"Minibatch / K-Means Ratio\", fontsize=14)\n", + "plt.title(\"Inertia Ratio\", fontsize=14)\n", + "plt.axis([1, 99, np.min(inertia_ratios) * 0.98, np.max(inertia_ratios) * 1.02])\n", + "\n", + "plt.subplot(122)\n", + "plt.plot(range(1, 100), time_ratios, \"bo\")\n", + "plt.plot([0, 100], [1.0, 1.0], \"r--\")\n", + "plt.plot([0, 100], lin_reg_time.predict([[0], [100]]), \"k-\")\n", + "plt.xlabel(\"$k$\", fontsize=16)\n", + "plt.title(\"Training Time Ratio\", fontsize=14)\n", + "plt.axis([2, 99, np.min(time_ratios) * 0.98, np.max(time_ratios) * 1.02])\n", + "\n", + "save_fig(\"minibatch_kmeans_vs_kmeans\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Finding the optimal number of clusters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What if the number of clusters was set to a lower or greater value than 5?" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans_k3 = KMeans(n_clusters=3, random_state=42)\n", + "kmeans_k8 = KMeans(n_clusters=8, random_state=42)\n", + "\n", + "plot_clusterer_comparison(kmeans_k3, kmeans_k8, X, \"$k=3$\", \"$k=8$\")\n", + "save_fig(\"bad_n_clusters_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ouch, these two models don't look great. What about their inertias?" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans_k3.inertia_" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans_k8.inertia_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "No, we cannot simply take the value of $k$ that minimizes the inertia, since it keeps getting lower as we increase $k$. Indeed, the more clusters there are, the closer each instance will be to its closest centroid, and therefore the lower the inertia will be. However, we can plot the inertia as a function of $k$ and analyze the resulting curve:" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans_per_k = [KMeans(n_clusters=k, random_state=42).fit(X)\n", + " for k in range(1, 10)]\n", + "inertias = [model.inertia_ for model in kmeans_per_k]" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8, 3.5))\n", + "plt.plot(range(1, 10), inertias, \"bo-\")\n", + "plt.xlabel(\"$k$\", fontsize=14)\n", + "plt.ylabel(\"Inertia\", fontsize=14)\n", + "plt.annotate('Elbow',\n", + " xy=(4, inertias[3]),\n", + " xytext=(0.55, 0.55),\n", + " textcoords='figure fraction',\n", + " fontsize=16,\n", + " arrowprops=dict(facecolor='black', shrink=0.1)\n", + " )\n", + "plt.axis([1, 8.5, 0, 1300])\n", + "save_fig(\"inertia_vs_k_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, there is an elbow at $k=4$, which means that less clusters than that would be bad, and more clusters would not help much and might cut clusters in half. So $k=4$ is a pretty good choice. Of course in this example it is not perfect since it means that the two blobs in the lower left will be considered as just a single cluster, but it's a pretty good clustering nonetheless." + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": {}, + "outputs": [], + "source": [ + "plot_decision_boundaries(kmeans_per_k[4-1], X)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another approach is to look at the _silhouette score_, which is the mean _silhouette coefficient_ over all the instances. An instance's silhouette coefficient is equal to $(a - b)/\\max(a, b)$ where $a$ is the mean distance to the other instances in the same cluster (it is the _mean intra-cluster distance_), and $b$ is the _mean nearest-cluster distance_, that is the mean distance to the instances of the next closest cluster (defined as the one that minimizes $b$, excluding the instance's own cluster). The silhouette coefficient can vary between -1 and +1: a coefficient close to +1 means that the instance is well inside its own cluster and far from other clusters, while a coefficient close to 0 means that it is close to a cluster boundary, and finally a coefficient close to -1 means that the instance may have been assigned to the wrong cluster." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's plot the silhouette score as a function of $k$:" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.metrics import silhouette_score" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [], + "source": [ + "silhouette_score(X, kmeans.labels_)" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": {}, + "outputs": [], + "source": [ + "silhouette_scores = [silhouette_score(X, model.labels_)\n", + " for model in kmeans_per_k[1:]]" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8, 3))\n", + "plt.plot(range(2, 10), silhouette_scores, \"bo-\")\n", + "plt.xlabel(\"$k$\", fontsize=14)\n", + "plt.ylabel(\"Silhouette score\", fontsize=14)\n", + "plt.axis([1.8, 8.5, 0.55, 0.7])\n", + "save_fig(\"silhouette_score_vs_k_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, this visualization is much richer than the previous one: in particular, although it confirms that $k=4$ is a very good choice, but it also underlines the fact that $k=5$ is quite good as well." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An even more informative visualization is given when you plot every instance's silhouette coefficient, sorted by the cluster they are assigned to and by the value of the coefficient. This is called a _silhouette diagram_:" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.metrics import silhouette_samples\n", + "from matplotlib.ticker import FixedLocator, FixedFormatter\n", + "\n", + "plt.figure(figsize=(11, 9))\n", + "\n", + "for k in (3, 4, 5, 6):\n", + " plt.subplot(2, 2, k - 2)\n", + " \n", + " y_pred = kmeans_per_k[k - 1].labels_\n", + " silhouette_coefficients = silhouette_samples(X, y_pred)\n", + "\n", + " padding = len(X) // 30\n", + " pos = padding\n", + " ticks = []\n", + " for i in range(k):\n", + " coeffs = silhouette_coefficients[y_pred == i]\n", + " coeffs.sort()\n", + "\n", + " color = matplotlib.cm.spectral(i / k)\n", + " plt.fill_betweenx(np.arange(pos, pos + len(coeffs)), 0, coeffs,\n", + " facecolor=color, edgecolor=color, alpha=0.7)\n", + " ticks.append(pos + len(coeffs) // 2)\n", + " pos += len(coeffs) + padding\n", + "\n", + " plt.gca().yaxis.set_major_locator(FixedLocator(ticks))\n", + " plt.gca().yaxis.set_major_formatter(FixedFormatter(range(k)))\n", + " if k in (3, 5):\n", + " plt.ylabel(\"Cluster\")\n", + " \n", + " if k in (5, 6):\n", + " plt.gca().set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])\n", + " plt.xlabel(\"Silhouette Coefficient\")\n", + " else:\n", + " plt.tick_params(labelbottom='off')\n", + "\n", + " plt.axvline(x=silhouette_scores[k - 2], color=\"red\", linestyle=\"--\")\n", + " plt.title(\"$k={}$\".format(k), fontsize=16)\n", + "\n", + "save_fig(\"silhouette_analysis_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Limits of K-Means" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [], + "source": [ + "X1, y1 = make_blobs(n_samples=1000, centers=((4, -4), (0, 0)), random_state=42)\n", + "X1 = X1.dot(np.array([[0.374, 0.95], [0.732, 0.598]]))\n", + "X2, y2 = make_blobs(n_samples=250, centers=1, random_state=42)\n", + "X2 = X2 + [6, -8]\n", + "X = np.r_[X1, X2]\n", + "y = np.r_[y1, y2]" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [], + "source": [ + "plot_clusters(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans_good = KMeans(n_clusters=3, init=np.array([[-1.5, 2.5], [0.5, 0], [4, 0]]), n_init=1, random_state=42)\n", + "kmeans_bad = KMeans(n_clusters=3, random_state=42)\n", + "kmeans_good.fit(X)\n", + "kmeans_bad.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "plt.figure(figsize=(10, 3.2))\n", + "\n", + "plt.subplot(121)\n", + "plot_decision_boundaries(kmeans_good, X)\n", + "plt.title(\"Inertia = {:.1f}\".format(kmeans_good.inertia_), fontsize=14)\n", + "\n", + "plt.subplot(122)\n", + "plot_decision_boundaries(kmeans_bad, X, show_ylabels=False)\n", + "plt.title(\"Inertia = {:.1f}\".format(kmeans_bad.inertia_), fontsize=14)\n", + "\n", + "save_fig(\"bad_kmeans_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using clustering for image segmentation" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.image import imread\n", + "image = imread(os.path.join(\"images\",\"unsupervised_learning\",\"ladybug.png\"))\n", + "image.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [], + "source": [ + "X = image.reshape(-1, 3)\n", + "kmeans = KMeans(n_clusters=8, random_state=42).fit(X)\n", + "segmented_img = kmeans.cluster_centers_[kmeans.labels_]\n", + "segmented_img = segmented_img.reshape(image.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": {}, + "outputs": [], + "source": [ + "segmented_imgs = []\n", + "n_colors = (10, 8, 6, 4, 2)\n", + "for n_clusters in n_colors:\n", + " kmeans = KMeans(n_clusters=n_clusters, random_state=42).fit(X)\n", + " segmented_img = kmeans.cluster_centers_[kmeans.labels_]\n", + " segmented_imgs.append(segmented_img.reshape(image.shape))" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(10,5))\n", + "plt.subplots_adjust(wspace=0.05, hspace=0.1)\n", + "\n", + "plt.subplot(231)\n", + "plt.imshow(image)\n", + "plt.title(\"Original image\")\n", + "plt.axis('off')\n", + "\n", + "for idx, n_clusters in enumerate(n_colors):\n", + " plt.subplot(232 + idx)\n", + " plt.imshow(segmented_imgs[idx])\n", + " plt.title(\"{} colors\".format(n_clusters))\n", + " plt.axis('off')\n", + "\n", + "save_fig('image_segmentation_diagram', tight_layout=False)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using Clustering for Preprocessing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's tackle the _digits dataset_ which is a simple MNIST-like dataset containing 1,797 grayscale 8×8 images representing digits 0 to 9." + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.datasets import load_digits" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [], + "source": [ + "X_digits, y_digits = load_digits(return_X_y=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's split it into a training set and a test set:" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X_digits, y_digits, random_state=42)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's fit a Logistic Regression model and evaluate it on the test set:" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import LogisticRegression" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": {}, + "outputs": [], + "source": [ + "log_reg = LogisticRegression(random_state=42)\n", + "log_reg.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": {}, + "outputs": [], + "source": [ + "log_reg.score(X_test, y_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Okay, that's our baseline: 96.7% accuracy. Let's see if we can do better by using K-Means as a preprocessing step. We will create a pipeline that will first cluster the training set into 50 clusters and replace the images with their distances to the 50 clusters, then apply a logistic regression model:" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.pipeline import Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": {}, + "outputs": [], + "source": [ + "pipeline = Pipeline([\n", + " (\"kmeans\", KMeans(n_clusters=50, random_state=42)),\n", + " (\"log_reg\", LogisticRegression(random_state=42)),\n", + "])\n", + "pipeline.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [], + "source": [ + "pipeline.score(X_test, y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": {}, + "outputs": [], + "source": [ + "1 - (1 - 0.9822222) / (1 - 0.9666666)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How about that? We almost divided the error rate by a factor of 2! But we chose the number of clusters $k$ completely arbitrarily, we can surely do better. Since K-Means is just a preprocessing step in a classification pipeline, finding a good value for $k$ is much simpler than earlier: there's no need to perform silhouette analysis or minimize the inertia, the best value of $k$ is simply the one that results in the best classification performance." + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import GridSearchCV" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": {}, + "outputs": [], + "source": [ + "param_grid = dict(kmeans__n_clusters=range(2, 100))\n", + "grid_clf = GridSearchCV(pipeline, param_grid, cv=3, verbose=2)\n", + "grid_clf.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": {}, + "outputs": [], + "source": [ + "grid_clf.best_params_" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": {}, + "outputs": [], + "source": [ + "grid_clf.score(X_test, y_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The performance is slightly improved when $k=90$, so 90 it is." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Clustering for Semi-supervised Learning" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another use case for clustering is in semi-supervised learning, when we have plenty of unlabeled instances and very few labeled instances." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's look at the performance of a logistic regression model when we only have 50 labeled instances:" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": {}, + "outputs": [], + "source": [ + "n_labeled = 50" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": {}, + "outputs": [], + "source": [ + "log_reg = LogisticRegression(random_state=42)\n", + "log_reg.fit(X_train[:n_labeled], y_train[:n_labeled])\n", + "log_reg.score(X_test, y_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's much less than earlier of course. Let's see how we can do better. First, let's cluster the training set into 50 clusters, then for each cluster let's find the image closest to the centroid. We will call these images the representative images:" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": {}, + "outputs": [], + "source": [ + "k = 50" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": {}, + "outputs": [], + "source": [ + "kmeans = KMeans(n_clusters=k, random_state=42)\n", + "X_digits_dist = kmeans.fit_transform(X_train)\n", + "representative_digit_idx = np.argmin(X_digits_dist, axis=0)\n", + "X_representative_digits = X_train[representative_digit_idx]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's plot these representative images and label them manually:" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8, 2))\n", + "for index, X_representative_digit in enumerate(X_representative_digits):\n", + " plt.subplot(k // 10, 10, index + 1)\n", + " plt.imshow(X_representative_digit.reshape(8, 8), cmap=\"binary\", interpolation=\"bilinear\")\n", + " plt.axis('off')\n", + "\n", + "save_fig(\"representative_images_diagram\", tight_layout=False)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": {}, + "outputs": [], + "source": [ + "y_representative_digits = np.array([\n", + " 4, 8, 0, 6, 8, 3, 7, 7, 9, 2,\n", + " 5, 5, 8, 5, 2, 1, 2, 9, 6, 1,\n", + " 1, 6, 9, 0, 8, 3, 0, 7, 4, 1,\n", + " 6, 5, 2, 4, 1, 8, 6, 3, 9, 2,\n", + " 4, 2, 9, 4, 7, 6, 2, 3, 1, 1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we have a dataset with just 50 labeled instances, but instead of being completely random instances, each of them is a representative image of its cluster. Let's see if the performance is any better:" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": {}, + "outputs": [], + "source": [ + "log_reg = LogisticRegression(random_state=42)\n", + "log_reg.fit(X_representative_digits, y_representative_digits)\n", + "log_reg.score(X_test, y_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wow! We jumped from 82.7% accuracy to 92.4%, although we are still only training the model on 50 instances. Since it's often costly and painful to label instances, especially when it has to be done manually by experts, it's a good idea to make them label representative instances rather than just random instances." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But perhaps we can go one step further: what if we propagated the labels to all the other instances in the same cluster?" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [], + "source": [ + "y_train_propagated = np.empty(len(X_train), dtype=np.int32)\n", + "for i in range(k):\n", + " y_train_propagated[kmeans.labels_==i] = y_representative_digits[i]" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [], + "source": [ + "log_reg = LogisticRegression(random_state=42)\n", + "log_reg.fit(X_train, y_train_propagated)" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [], + "source": [ + "log_reg.score(X_test, y_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We got a tiny little accuracy boost. Better than nothing, but we should probably have propagated the labels only to the instances closest to the centroid, because by propagating to the full cluster, we have certainly included some outliers. Let's only propagate the labels to the 20th percentile closest to the centroid:" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": {}, + "outputs": [], + "source": [ + "percentile_closest = 20\n", + "\n", + "X_cluster_dist = X_digits_dist[np.arange(len(X_train)), kmeans.labels_]\n", + "for i in range(k):\n", + " in_cluster = (kmeans.labels_ == i)\n", + " cluster_dist = X_cluster_dist[in_cluster]\n", + " cutoff_distance = np.percentile(cluster_dist, percentile_closest)\n", + " above_cutoff = (X_cluster_dist > cutoff_distance)\n", + " X_cluster_dist[in_cluster & above_cutoff] = -1" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": {}, + "outputs": [], + "source": [ + "partially_propagated = (X_cluster_dist != -1)\n", + "X_train_partially_propagated = X_train[partially_propagated]\n", + "y_train_partially_propagated = y_train_propagated[partially_propagated]" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": {}, + "outputs": [], + "source": [ + "log_reg = LogisticRegression(random_state=42)\n", + "log_reg.fit(X_train_partially_propagated, y_train_partially_propagated)" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": {}, + "outputs": [], + "source": [ + "log_reg.score(X_test, y_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nice! With just 50 labeled instances (just 5 examples per class on average!), we got 94.2% performance, which is pretty close to the performance of logistic regression on the fully labeled _digits_ dataset (which was 96.7%)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is because the propagated labels are actually pretty good: their accuracy is very close to 99%:" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "metadata": {}, + "outputs": [], + "source": [ + "np.mean(y_train_partially_propagated == y_train[partially_propagated])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You could now do a few iterations of _active learning_:\n", + "1. Manually label the instances that the classifier is least sure about, if possible by picking them in distinct clusters.\n", + "2. Train a new model with these additional labels." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## DBSCAN" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.datasets import make_moons" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "metadata": {}, + "outputs": [], + "source": [ + "X, y = make_moons(n_samples=1000, noise=0.05, random_state=42)" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.cluster import DBSCAN" + ] + }, + { + "cell_type": "code", + "execution_count": 179, + "metadata": {}, + "outputs": [], + "source": [ + "dbscan = DBSCAN(eps=0.05)\n", + "dbscan.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 180, + "metadata": {}, + "outputs": [], + "source": [ + "dbscan.labels_[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": {}, + "outputs": [], + "source": [ + "len(dbscan.core_sample_indices_)" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": {}, + "outputs": [], + "source": [ + "dbscan.core_sample_indices_[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": {}, + "outputs": [], + "source": [ + "dbscan.components_[:3]" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "metadata": {}, + "outputs": [], + "source": [ + "np.unique(dbscan.labels_)" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "metadata": {}, + "outputs": [], + "source": [ + "dbscan2 = DBSCAN(eps=0.2)\n", + "dbscan2.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_dbscan(dbscan, X, size, show_xlabels=True, show_ylabels=True):\n", + " core_mask = np.zeros_like(dbscan.labels_, dtype=bool)\n", + " core_mask[dbscan.core_sample_indices_] = True\n", + " anomalies_mask = dbscan.labels_ == -1\n", + " non_core_mask = ~(core_mask | anomalies_mask)\n", + "\n", + " cores = dbscan.components_\n", + " anomalies = X[anomalies_mask]\n", + " non_cores = X[non_core_mask]\n", + " \n", + " plt.scatter(cores[:, 0], cores[:, 1],\n", + " c=dbscan.labels_[core_mask], marker='o', s=size, cmap=\"Paired\")\n", + " plt.scatter(cores[:, 0], cores[:, 1], marker='*', s=20, c=dbscan.labels_[core_mask])\n", + " plt.scatter(anomalies[:, 0], anomalies[:, 1],\n", + " c=\"r\", marker=\"x\", s=100)\n", + " plt.scatter(non_cores[:, 0], non_cores[:, 1], c=dbscan.labels_[non_core_mask], marker=\".\")\n", + " if show_xlabels:\n", + " plt.xlabel(\"$x_1$\", fontsize=14)\n", + " else:\n", + " plt.tick_params(labelbottom='off')\n", + " if show_ylabels:\n", + " plt.ylabel(\"$x_2$\", fontsize=14, rotation=0)\n", + " else:\n", + " plt.tick_params(labelleft='off')\n", + " plt.title(\"eps={:.2f}\".format(dbscan.eps), fontsize=14)" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(9, 3.2))\n", + "\n", + "plt.subplot(121)\n", + "plot_dbscan(dbscan, X, size=600)\n", + "\n", + "plt.subplot(122)\n", + "plot_dbscan(dbscan2, X, size=100, show_ylabels=False)\n", + "\n", + "save_fig(\"dbscan_diagram\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "metadata": {}, + "outputs": [], + "source": [ + "dbscan = dbscan2" + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.neighbors import KNeighborsClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "metadata": {}, + "outputs": [], + "source": [ + "knn = KNeighborsClassifier(n_neighbors=50)\n", + "knn.fit(dbscan.components_, dbscan.labels_[dbscan.core_sample_indices_])" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "metadata": {}, + "outputs": [], + "source": [ + "X_new = np.array([[-0.5, 0], [0, 0.5], [1, -0.1], [2, 1]])\n", + "knn.predict(X_new)" + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "metadata": {}, + "outputs": [], + "source": [ + "knn.predict_proba(X_new)" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(6, 3))\n", + "plot_decision_boundaries(knn, X, show_centroids=False)\n", + "plt.scatter(X_new[:, 0], X_new[:, 1], c=\"b\", marker=\"+\", s=200, zorder=10)\n", + "save_fig(\"cluster_classification_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": {}, + "outputs": [], + "source": [ + "y_dist, y_pred_idx = knn.kneighbors(X_new, n_neighbors=1)\n", + "y_pred = dbscan.labels_[dbscan.core_sample_indices_][y_pred_idx]\n", + "y_pred[y_dist > 0.2] = -1\n", + "y_pred.ravel()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Other Clustering Algorithms" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spectral Clustering" + ] + }, + { + "cell_type": "code", + "execution_count": 195, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.cluster import SpectralClustering" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "metadata": {}, + "outputs": [], + "source": [ + "sc1 = SpectralClustering(n_clusters=2, gamma=100, random_state=42)\n", + "sc1.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "metadata": {}, + "outputs": [], + "source": [ + "sc2 = SpectralClustering(n_clusters=2, gamma=1, random_state=42)\n", + "sc2.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 198, + "metadata": {}, + "outputs": [], + "source": [ + "np.percentile(sc1.affinity_matrix_, 95)" + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_spectral_clustering(sc, X, size, alpha, show_xlabels=True, show_ylabels=True):\n", + " plt.scatter(X[:, 0], X[:, 1], marker='o', s=size, c='gray', cmap=\"Paired\", alpha=alpha)\n", + " plt.scatter(X[:, 0], X[:, 1], marker='o', s=30, c='w')\n", + " plt.scatter(X[:, 0], X[:, 1], marker='.', s=10, c=sc.labels_, cmap=\"Paired\")\n", + " \n", + " if show_xlabels:\n", + " plt.xlabel(\"$x_1$\", fontsize=14)\n", + " else:\n", + " plt.tick_params(labelbottom='off')\n", + " if show_ylabels:\n", + " plt.ylabel(\"$x_2$\", fontsize=14, rotation=0)\n", + " else:\n", + " plt.tick_params(labelleft='off')\n", + " plt.title(\"RBF gamma={}\".format(sc.gamma), fontsize=14)" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(9, 3.2))\n", + "\n", + "plt.subplot(121)\n", + "plot_spectral_clustering(sc1, X, size=500, alpha=0.1)\n", + "\n", + "plt.subplot(122)\n", + "plot_spectral_clustering(sc2, X, size=4000, alpha=0.01, show_ylabels=False)\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Agglomerative Clustering" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.cluster import AgglomerativeClustering" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": {}, + "outputs": [], + "source": [ + "X = np.array([0, 2, 5, 8.5]).reshape(-1, 1)\n", + "agg = AgglomerativeClustering(linkage=\"complete\").fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 203, + "metadata": {}, + "outputs": [], + "source": [ + "learned_parameters(agg)" + ] + }, + { + "cell_type": "code", + "execution_count": 204, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "agg.children_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Gaussian Mixtures" + ] + }, + { + "cell_type": "code", + "execution_count": 205, + "metadata": {}, + "outputs": [], + "source": [ + "X1, y1 = make_blobs(n_samples=1000, centers=((4, -4), (0, 0)), random_state=42)\n", + "X1 = X1.dot(np.array([[0.374, 0.95], [0.732, 0.598]]))\n", + "X2, y2 = make_blobs(n_samples=250, centers=1, random_state=42)\n", + "X2 = X2 + [6, -8]\n", + "X = np.r_[X1, X2]\n", + "y = np.r_[y1, y2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's train a Gaussian mixture model on the previous dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": 206, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.mixture import GaussianMixture" + ] + }, + { + "cell_type": "code", + "execution_count": 207, + "metadata": {}, + "outputs": [], + "source": [ + "gm = GaussianMixture(n_components=3, n_init=10, random_state=42)\n", + "gm.fit(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's look at the parameters that the EM algorithm estimated:" + ] + }, + { + "cell_type": "code", + "execution_count": 208, + "metadata": {}, + "outputs": [], + "source": [ + "gm.weights_" + ] + }, + { + "cell_type": "code", + "execution_count": 209, + "metadata": {}, + "outputs": [], + "source": [ + "gm.means_" + ] + }, + { + "cell_type": "code", + "execution_count": 210, + "metadata": {}, + "outputs": [], + "source": [ + "gm.covariances_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Did the algorithm actually converge?" + ] + }, + { + "cell_type": "code", + "execution_count": 211, + "metadata": {}, + "outputs": [], + "source": [ + "gm.converged_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Yes, good. How many iterations did it take?" + ] + }, + { + "cell_type": "code", + "execution_count": 212, + "metadata": {}, + "outputs": [], + "source": [ + "gm.n_iter_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can now use the model to predict which cluster each instance belongs to (hard clustering) or the probabilities that it came from each cluster. For this, just use `predict()` method or the `predict_proba()` method:" + ] + }, + { + "cell_type": "code", + "execution_count": 213, + "metadata": {}, + "outputs": [], + "source": [ + "gm.predict(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 214, + "metadata": {}, + "outputs": [], + "source": [ + "gm.predict_proba(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is a generative model, so you can sample new instances from it (and get their labels):" + ] + }, + { + "cell_type": "code", + "execution_count": 215, + "metadata": {}, + "outputs": [], + "source": [ + "X_new, y_new = gm.sample(6)\n", + "X_new" + ] + }, + { + "cell_type": "code", + "execution_count": 216, + "metadata": {}, + "outputs": [], + "source": [ + "y_new" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that they are sampled sequentially from each cluster." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also estimate the log of the _probability density function_ (PDF) at any location using the `score_samples()` method:" + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "metadata": {}, + "outputs": [], + "source": [ + "gm.score_samples(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's check that the PDF integrates to 1 over the whole space. We just take a large square around the clusters, and chop it into a grid of tiny squares, then we compute the approximate probability that the instances will be generated in each tiny square (by multiplying the PDF at one corner of the tiny square by the area of the square), and finally summing all these probabilities). The result is very close to 1:" + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "metadata": {}, + "outputs": [], + "source": [ + "resolution = 100\n", + "grid = np.arange(-10, 10, 1 / resolution)\n", + "xx, yy = np.meshgrid(grid, grid)\n", + "X_full = np.vstack([xx.ravel(), yy.ravel()]).T\n", + "\n", + "pdf = np.exp(gm.score_samples(X_full))\n", + "pdf_probas = pdf * (1 / resolution) ** 2\n", + "pdf_probas.sum()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's plot the resulting decision boundaries (dashed lines) and density contours:" + ] + }, + { + "cell_type": "code", + "execution_count": 219, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.colors import LogNorm\n", + "\n", + "def plot_gaussian_mixture(clusterer, X, resolution=1000, show_ylabels=True):\n", + " mins = X.min(axis=0) - 0.1\n", + " maxs = X.max(axis=0) + 0.1\n", + " xx, yy = np.meshgrid(np.linspace(mins[0], maxs[0], resolution),\n", + " np.linspace(mins[1], maxs[1], resolution))\n", + " Z = -clusterer.score_samples(np.c_[xx.ravel(), yy.ravel()])\n", + " Z = Z.reshape(xx.shape)\n", + "\n", + " plt.contourf(xx, yy, Z,\n", + " norm=LogNorm(vmin=1.0, vmax=30.0),\n", + " levels=np.logspace(0, 2, 12))\n", + " plt.contour(xx, yy, Z,\n", + " norm=LogNorm(vmin=1.0, vmax=30.0),\n", + " levels=np.logspace(0, 2, 12),\n", + " linewidths=1, colors='k')\n", + "\n", + " Z = clusterer.predict(np.c_[xx.ravel(), yy.ravel()])\n", + " Z = Z.reshape(xx.shape)\n", + " plt.contour(xx, yy, Z,\n", + " linewidths=2, colors='r', linestyles='dashed')\n", + " \n", + " plt.plot(X[:, 0], X[:, 1], 'k.', markersize=2)\n", + " plot_centroids(clusterer.means_, clusterer.weights_)\n", + "\n", + " plt.xlabel(\"$x_1$\", fontsize=14)\n", + " if show_ylabels:\n", + " plt.ylabel(\"$x_2$\", fontsize=14, rotation=0)\n", + " else:\n", + " plt.tick_params(labelleft='off')" + ] + }, + { + "cell_type": "code", + "execution_count": 220, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8, 4))\n", + "\n", + "plot_gaussian_mixture(gm, X)\n", + "\n", + "save_fig(\"gaussian_mixtures_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can impose constraints on the covariance matrices that the algorithm looks for by setting the `covariance_type` hyperparameter:\n", + "* `\"full\"` (default): no constraint, all clusters can take on any ellipsoidal shape of any size.\n", + "* `\"tied\"`: all clusters must have the same shape, which can be any ellipsoid (i.e., they all share the same covariance matrix).\n", + "* `\"spherical\"`: all clusters must be spherical, but they can have different diameters (i.e., different variances).\n", + "* `\"diag\"`: clusters can take on any ellipsoidal shape of any size, but the ellipsoid's axes must be parallel to the axes (i.e., the covariance matrices must be diagonal)." + ] + }, + { + "cell_type": "code", + "execution_count": 221, + "metadata": {}, + "outputs": [], + "source": [ + "gm_full = GaussianMixture(n_components=3, n_init=10, covariance_type=\"full\", random_state=42)\n", + "gm_tied = GaussianMixture(n_components=3, n_init=10, covariance_type=\"tied\", random_state=42)\n", + "gm_spherical = GaussianMixture(n_components=3, n_init=10, covariance_type=\"spherical\", random_state=42)\n", + "gm_diag = GaussianMixture(n_components=3, n_init=10, covariance_type=\"diag\", random_state=42)\n", + "gm_full.fit(X)\n", + "gm_tied.fit(X)\n", + "gm_spherical.fit(X)\n", + "gm_diag.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 222, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_gaussian_mixtures(gm1, gm2, X):\n", + " plt.figure(figsize=(9, 4))\n", + "\n", + " plt.subplot(121)\n", + " plot_gaussian_mixture(gm1, X)\n", + " plt.title('covariance_type=\"{}\"'.format(gm1.covariance_type), fontsize=14)\n", + "\n", + " plt.subplot(122)\n", + " plot_gaussian_mixture(gm2, X, show_ylabels=False)\n", + " plt.title('covariance_type=\"{}\"'.format(gm2.covariance_type), fontsize=14)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 223, + "metadata": {}, + "outputs": [], + "source": [ + "compare_gaussian_mixtures(gm_tied, gm_spherical, X)\n", + "\n", + "save_fig(\"covariance_type_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 224, + "metadata": {}, + "outputs": [], + "source": [ + "compare_gaussian_mixtures(gm_full, gm_diag, X)\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Anomaly Detection using Gaussian Mixtures" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Gaussian Mixtures can be used for _anomaly detection_: instances located in low-density regions can be considered anomalies. You must define what density threshold you want to use. For example, in a manufacturing company that tries to detect defective products, the ratio of defective products is usually well-known. Say it is equal to 4%, then you can set the density threshold to be the value that results in having 4% of the instances located in areas below that threshold density:" + ] + }, + { + "cell_type": "code", + "execution_count": 225, + "metadata": {}, + "outputs": [], + "source": [ + "densities = gm.score_samples(X)\n", + "density_threshold = np.percentile(densities, 4)\n", + "anomalies = X[densities < density_threshold]" + ] + }, + { + "cell_type": "code", + "execution_count": 226, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8, 4))\n", + "\n", + "plot_gaussian_mixture(gm, X)\n", + "plt.scatter(anomalies[:, 0], anomalies[:, 1], color='r', marker='*')\n", + "\n", + "save_fig(\"anomaly_detection_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model selection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We cannot use the inertia or the silhouette score because they both assume that the clusters are spherical. Instead, we can try to find the model that minimizes a theoretical information criterion such as the Bayesian Information Criterion (BIC) or the Akaike Information Criterion (AIC):\n", + "\n", + "${BIC} = {\\log(m)p - 2\\log({\\hat L})}$\n", + "\n", + "${AIC} = 2p - 2\\log(\\hat L)$\n", + "\n", + "* $m$ is the number of instances.\n", + "* $p$ is the number of parameters learned by the model.\n", + "* $\\hat L$ is the maximized value of the likelihood function of the model. This is the conditional probability of the observed data $\\mathbf{X}$, given the model and its optimized parameters.\n", + "\n", + "Both BIC and AIC penalize models that have more parameters to learn (e.g., more clusters), and reward models that fit the data well (i.e., models that give a high likelihood to the observed data)." + ] + }, + { + "cell_type": "code", + "execution_count": 227, + "metadata": {}, + "outputs": [], + "source": [ + "gm.bic(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 228, + "metadata": {}, + "outputs": [], + "source": [ + "gm.aic(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We could compute the BIC manually like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 229, + "metadata": {}, + "outputs": [], + "source": [ + "n_clusters = 3\n", + "n_dims = 2\n", + "n_params_for_weights = n_clusters - 1\n", + "n_params_for_means = n_clusters * n_dims\n", + "n_params_for_covariance = n_clusters * n_dims * (n_dims + 1) // 2\n", + "n_params = n_params_for_weights + n_params_for_means + n_params_for_covariance\n", + "max_log_likelihood = gm.score(X) * len(X) # log(L^)\n", + "bic = np.log(len(X)) * n_params - 2 * max_log_likelihood\n", + "aic = 2 * n_params - 2 * max_log_likelihood" + ] + }, + { + "cell_type": "code", + "execution_count": 230, + "metadata": {}, + "outputs": [], + "source": [ + "bic, aic" + ] + }, + { + "cell_type": "code", + "execution_count": 231, + "metadata": {}, + "outputs": [], + "source": [ + "n_params" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There's one weight per cluster, but the sum must be equal to 1, so we have one degree of freedom less, hence the -1. Similarly, the degrees of freedom for an $n \\times n$ covariance matrix is not $n^2$, but $1 + 2 + \\dots + n = \\dfrac{n (n+1)}{2}$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's train Gaussian Mixture models with various values of $k$ and measure their BIC:" + ] + }, + { + "cell_type": "code", + "execution_count": 232, + "metadata": {}, + "outputs": [], + "source": [ + "gms_per_k = [GaussianMixture(n_components=k, n_init=10, random_state=42).fit(X)\n", + " for k in range(1, 11)]" + ] + }, + { + "cell_type": "code", + "execution_count": 233, + "metadata": {}, + "outputs": [], + "source": [ + "bics = [model.bic(X) for model in gms_per_k]\n", + "aics = [model.aic(X) for model in gms_per_k]" + ] + }, + { + "cell_type": "code", + "execution_count": 234, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8, 3))\n", + "plt.plot(range(1, 11), bics, \"bo-\", label=\"BIC\")\n", + "plt.plot(range(1, 11), aics, \"go--\", label=\"AIC\")\n", + "plt.xlabel(\"$k$\", fontsize=14)\n", + "plt.ylabel(\"Information Criterion\", fontsize=14)\n", + "plt.axis([1, 9.5, np.min(aics) - 50, np.max(aics) + 50])\n", + "plt.annotate('Minimum',\n", + " xy=(3, bics[2]),\n", + " xytext=(0.35, 0.6),\n", + " textcoords='figure fraction',\n", + " fontsize=14,\n", + " arrowprops=dict(facecolor='black', shrink=0.1)\n", + " )\n", + "plt.legend()\n", + "save_fig(\"aic_bic_vs_k_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's search for best combination of values for both the number of clusters and the `covariance_type` hyperparameter:" + ] + }, + { + "cell_type": "code", + "execution_count": 235, + "metadata": {}, + "outputs": [], + "source": [ + "min_bic = np.infty\n", + "\n", + "for k in range(1, 11):\n", + " for covariance_type in (\"full\", \"tied\", \"spherical\", \"diag\"):\n", + " bic = GaussianMixture(n_components=k, n_init=10,\n", + " covariance_type=covariance_type,\n", + " random_state=42).fit(X).bic(X)\n", + " if bic < min_bic:\n", + " min_bic = bic\n", + " best_k = k\n", + " best_covariance_type = covariance_type" + ] + }, + { + "cell_type": "code", + "execution_count": 236, + "metadata": {}, + "outputs": [], + "source": [ + "best_k" + ] + }, + { + "cell_type": "code", + "execution_count": 237, + "metadata": {}, + "outputs": [], + "source": [ + "best_covariance_type" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Variational Bayesian Gaussian Mixtures" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rather than manually searching for the optimal number of clusters, it is possible to use instead the `BayesianGaussianMixture` class which is capable of giving weights equal (or close) to zero to unnecessary clusters. Just set the number of components to a value that you believe is greater than the optimal number of clusters, and the algorithm will eliminate the unnecessary clusters automatically." + ] + }, + { + "cell_type": "code", + "execution_count": 238, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.mixture import BayesianGaussianMixture" + ] + }, + { + "cell_type": "code", + "execution_count": 239, + "metadata": {}, + "outputs": [], + "source": [ + "bgm = BayesianGaussianMixture(n_components=10, n_init=10, random_state=42)\n", + "bgm.fit(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The algorithm automatically detected that only 3 components are needed:" + ] + }, + { + "cell_type": "code", + "execution_count": 240, + "metadata": {}, + "outputs": [], + "source": [ + "np.round(bgm.weights_, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 241, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(8, 5))\n", + "plot_gaussian_mixture(bgm, X)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 242, + "metadata": {}, + "outputs": [], + "source": [ + "bgm_low = BayesianGaussianMixture(n_components=10, max_iter=1000, n_init=1,\n", + " weight_concentration_prior=0.01, random_state=42)\n", + "bgm_high = BayesianGaussianMixture(n_components=10, max_iter=1000, n_init=1,\n", + " weight_concentration_prior=10000, random_state=42)\n", + "nn = 73\n", + "bgm_low.fit(X[:nn])\n", + "bgm_high.fit(X[:nn])" + ] + }, + { + "cell_type": "code", + "execution_count": 243, + "metadata": {}, + "outputs": [], + "source": [ + "np.round(bgm_low.weights_, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 244, + "metadata": {}, + "outputs": [], + "source": [ + "np.round(bgm_high.weights_, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 245, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(9, 4))\n", + "\n", + "plt.subplot(121)\n", + "plot_gaussian_mixture(bgm_low, X[:nn])\n", + "plt.title(\"weight_concentration_prior = 0.01\", fontsize=14)\n", + "\n", + "plt.subplot(122)\n", + "plot_gaussian_mixture(bgm_high, X[:nn], show_ylabels=False)\n", + "plt.title(\"weight_concentration_prior = 10000\", fontsize=14)\n", + "\n", + "save_fig(\"mixture_concentration_prior_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 246, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "bgm = BayesianGaussianMixture(n_components=10, n_init=10, random_state=42)\n", + "bgm.fit(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 247, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(9, 3.2))\n", + "\n", + "plt.subplot(121)\n", + "plot_data(X)\n", + "plt.xlabel(\"$x_1$\", fontsize=14)\n", + "plt.ylabel(\"$x_2$\", fontsize=14, rotation=0)\n", + "\n", + "plt.subplot(122)\n", + "plot_gaussian_mixture(bgm, X, show_ylabels=False)\n", + "\n", + "save_fig(\"moons_vs_bgm_diagram\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Oops, not great... instead of detecting 2 moon-shaped clusters, the algorithm detected 8 ellipsoidal clusters. However, the density plot does not look too bad, so it might be usable for anomaly detection." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Likelihood Function" + ] + }, + { + "cell_type": "code", + "execution_count": 248, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.stats import norm" + ] + }, + { + "cell_type": "code", + "execution_count": 249, + "metadata": {}, + "outputs": [], + "source": [ + "xx = np.linspace(-6, 4, 101)\n", + "ss = np.linspace(1, 2, 101)\n", + "XX, SS = np.meshgrid(xx, ss)\n", + "ZZ = 2 * norm.pdf(XX - 1.0, 0, SS) + norm.pdf(XX + 4.0, 0, SS)\n", + "ZZ = ZZ / ZZ.sum(axis=1) / (xx[1] - xx[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 250, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.patches import Polygon\n", + "\n", + "plt.figure(figsize=(8, 4.5))\n", + "\n", + "x_idx = 85\n", + "s_idx = 30\n", + "\n", + "plt.subplot(221)\n", + "plt.contourf(XX, SS, ZZ, cmap=\"GnBu\")\n", + "plt.plot([-6, 4], [ss[s_idx], ss[s_idx]], \"k-\", linewidth=2)\n", + "plt.plot([xx[x_idx], xx[x_idx]], [1, 2], \"b-\", linewidth=2)\n", + "plt.xlabel(r\"$x$\")\n", + "plt.ylabel(r\"$\\theta$\", fontsize=14, rotation=0)\n", + "plt.title(r\"Model $f(x; \\theta)$\", fontsize=14)\n", + "\n", + "plt.subplot(222)\n", + "plt.plot(ss, ZZ[:, x_idx], \"b-\")\n", + "max_idx = np.argmax(ZZ[:, x_idx])\n", + "max_val = np.max(ZZ[:, x_idx])\n", + "plt.plot(ss[max_idx], max_val, \"r.\")\n", + "plt.plot([ss[max_idx], ss[max_idx]], [0, max_val], \"r:\")\n", + "plt.plot([0, ss[max_idx]], [max_val, max_val], \"r:\")\n", + "plt.text(1.01, max_val + 0.005, r\"$\\hat{L}$\", fontsize=14)\n", + "plt.text(ss[max_idx]+ 0.01, 0.055, r\"$\\hat{\\theta}$\", fontsize=14)\n", + "plt.text(ss[max_idx]+ 0.01, max_val - 0.012, r\"$Max$\", fontsize=12)\n", + "plt.axis([1, 2, 0.05, 0.15])\n", + "plt.xlabel(r\"$\\theta$\", fontsize=14)\n", + "plt.grid(True)\n", + "plt.text(1.99, 0.135, r\"$=f(x=2.5; \\theta)$\", fontsize=14, ha=\"right\")\n", + "plt.title(r\"Likelihood function $\\mathcal{L}(\\theta|x=2.5)$\", fontsize=14)\n", + "\n", + "plt.subplot(223)\n", + "plt.plot(xx, ZZ[s_idx], \"k-\")\n", + "plt.axis([-6, 4, 0, 0.25])\n", + "plt.xlabel(r\"$x$\", fontsize=14)\n", + "plt.grid(True)\n", + "plt.title(r\"PDF $f(x; \\theta=1.3)$\", fontsize=14)\n", + "verts = [(xx[41], 0)] + list(zip(xx[41:81], ZZ[s_idx, 41:81])) + [(xx[80], 0)]\n", + "poly = Polygon(verts, facecolor='0.9', edgecolor='0.5')\n", + "plt.gca().add_patch(poly)\n", + "\n", + "plt.subplot(224)\n", + "plt.plot(ss, np.log(ZZ[:, x_idx]), \"b-\")\n", + "max_idx = np.argmax(np.log(ZZ[:, x_idx]))\n", + "max_val = np.max(np.log(ZZ[:, x_idx]))\n", + "plt.plot(ss[max_idx], max_val, \"r.\")\n", + "plt.plot([ss[max_idx], ss[max_idx]], [-5, max_val], \"r:\")\n", + "plt.plot([0, ss[max_idx]], [max_val, max_val], \"r:\")\n", + "plt.axis([1, 2, -2.4, -2])\n", + "plt.xlabel(r\"$\\theta$\", fontsize=14)\n", + "plt.text(ss[max_idx]+ 0.01, max_val - 0.05, r\"$Max$\", fontsize=12)\n", + "plt.text(ss[max_idx]+ 0.01, -2.39, r\"$\\hat{\\theta}$\", fontsize=14)\n", + "plt.text(1.01, max_val + 0.02, r\"$\\log \\, \\hat{L}$\", fontsize=14)\n", + "plt.grid(True)\n", + "plt.title(r\"$\\log \\, \\mathcal{L}(\\theta|x=2.5)$\", fontsize=14)\n", + "\n", + "save_fig(\"likelihood_function_diagram\")\n", + "plt.show()" + ] + }, { "cell_type": "markdown", "metadata": { @@ -1501,10 +4526,8 @@ }, { "cell_type": "code", - "execution_count": 72, - "metadata": { - "collapsed": true - }, + "execution_count": 251, + "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import fetch_mldata\n", @@ -1513,10 +4536,8 @@ }, { "cell_type": "code", - "execution_count": 73, - "metadata": { - "collapsed": true - }, + "execution_count": 252, + "metadata": {}, "outputs": [], "source": [ "X_train = mnist['data'][:60000]\n", @@ -1535,10 +4556,8 @@ }, { "cell_type": "code", - "execution_count": 74, - "metadata": { - "collapsed": true - }, + "execution_count": 253, + "metadata": {}, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", @@ -1548,10 +4567,8 @@ }, { "cell_type": "code", - "execution_count": 75, - "metadata": { - "collapsed": true - }, + "execution_count": 254, + "metadata": {}, "outputs": [], "source": [ "import time\n", @@ -1563,7 +4580,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 255, "metadata": {}, "outputs": [], "source": [ @@ -1572,7 +4589,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 256, "metadata": {}, "outputs": [], "source": [ @@ -1591,10 +4608,8 @@ }, { "cell_type": "code", - "execution_count": 78, - "metadata": { - "collapsed": true - }, + "execution_count": 257, + "metadata": {}, "outputs": [], "source": [ "from sklearn.decomposition import PCA\n", @@ -1612,10 +4627,8 @@ }, { "cell_type": "code", - "execution_count": 79, - "metadata": { - "collapsed": true - }, + "execution_count": 258, + "metadata": {}, "outputs": [], "source": [ "rnd_clf2 = RandomForestClassifier(random_state=42)\n", @@ -1626,7 +4639,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 259, "metadata": {}, "outputs": [], "source": [ @@ -1649,7 +4662,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 260, "metadata": {}, "outputs": [], "source": [ @@ -1670,10 +4683,8 @@ }, { "cell_type": "code", - "execution_count": 82, - "metadata": { - "collapsed": true - }, + "execution_count": 261, + "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LogisticRegression\n", @@ -1686,7 +4697,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 262, "metadata": {}, "outputs": [], "source": [ @@ -1695,7 +4706,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 263, "metadata": {}, "outputs": [], "source": [ @@ -1712,10 +4723,8 @@ }, { "cell_type": "code", - "execution_count": 85, - "metadata": { - "collapsed": true - }, + "execution_count": 264, + "metadata": {}, "outputs": [], "source": [ "log_clf2 = LogisticRegression(multi_class=\"multinomial\", solver=\"lbfgs\", random_state=42)\n", @@ -1726,7 +4735,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 265, "metadata": {}, "outputs": [], "source": [ @@ -1742,7 +4751,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 266, "metadata": {}, "outputs": [], "source": [ @@ -1787,10 +4796,8 @@ }, { "cell_type": "code", - "execution_count": 88, - "metadata": { - "collapsed": true - }, + "execution_count": 267, + "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import fetch_mldata\n", @@ -1807,10 +4814,8 @@ }, { "cell_type": "code", - "execution_count": 89, - "metadata": { - "collapsed": true - }, + "execution_count": 268, + "metadata": {}, "outputs": [], "source": [ "np.random.seed(42)\n", @@ -1831,10 +4836,8 @@ }, { "cell_type": "code", - "execution_count": 90, - "metadata": { - "collapsed": true - }, + "execution_count": 269, + "metadata": {}, "outputs": [], "source": [ "from sklearn.manifold import TSNE\n", @@ -1852,7 +4855,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 270, "metadata": {}, "outputs": [], "source": [ @@ -1879,7 +4882,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 271, "metadata": {}, "outputs": [], "source": [ @@ -1900,10 +4903,8 @@ }, { "cell_type": "code", - "execution_count": 93, - "metadata": { - "collapsed": true - }, + "execution_count": 272, + "metadata": {}, "outputs": [], "source": [ "idx = (y == 2) | (y == 3) | (y == 5) \n", @@ -1916,7 +4917,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 273, "metadata": {}, "outputs": [], "source": [ @@ -1952,10 +4953,8 @@ }, { "cell_type": "code", - "execution_count": 95, - "metadata": { - "collapsed": true - }, + "execution_count": 274, + "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import MinMaxScaler\n", @@ -1998,7 +4997,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 275, "metadata": {}, "outputs": [], "source": [ @@ -2014,7 +5013,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 276, "metadata": {}, "outputs": [], "source": [ @@ -2023,7 +5022,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 277, "metadata": {}, "outputs": [], "source": [ @@ -2046,7 +5045,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 278, "metadata": {}, "outputs": [], "source": [ @@ -2070,7 +5069,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 279, "metadata": {}, "outputs": [], "source": [ @@ -2093,7 +5092,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 280, "metadata": {}, "outputs": [], "source": [ @@ -2127,7 +5126,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 281, "metadata": {}, "outputs": [], "source": [ @@ -2151,7 +5150,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 282, "metadata": {}, "outputs": [], "source": [ @@ -2185,7 +5184,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 283, "metadata": {}, "outputs": [], "source": [ @@ -2215,7 +5214,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 284, "metadata": {}, "outputs": [], "source": [ @@ -2238,7 +5237,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 285, "metadata": {}, "outputs": [], "source": [ @@ -2264,9 +5263,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] } @@ -2288,21 +5285,8 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" - }, - "nav_menu": { - "height": "352px", - "width": "458px" - }, - "toc": { - "navigate_menu": true, - "number_sections": true, - "sideBar": true, - "threshold": 6, - "toc_cell": false, - "toc_section_display": "block", - "toc_window_display": false } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 2 } diff --git a/images/dim_reduction/README b/images/unsupervised_learning/README similarity index 100% rename from images/dim_reduction/README rename to images/unsupervised_learning/README diff --git a/images/unsupervised_learning/ladybug.png b/images/unsupervised_learning/ladybug.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e350173652fc09844f210402ed6f9359439f69 GIT binary patch literal 574484 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ⅈ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Π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Ðiktj23>}uv$ja8`L9&QVoc>7*tTlhnYW;a)E?-{?<;_qeCrd*OcxvdhJ zwbDmmErI9$8UU#*BV}nmy6;K7AI{u9%t5oNonE)?XjV?!VH?&=Y1CbanuIUnFgH$X zf5>c@<2WYd5+BPexdIU@Gug8%Me#Iklu>1_HdJb%IA}^M(z9ho-P(7NXvCWy$8YNU z-h1p>z_*x4Nob4eT5B!qiBKE4gUmvEPiQ7)H(i@6+Dj+gMaBO6>OJu9??D*YiL;Wj zyHeuaIrV;K`!|~dW!574E+l9~_FNfBRG^~sV1(@cm<8*mZGWcTv24iR61J|X(ISp2 z%%pd$G0lm_miK}Kow!sCDhg!?f`y=RiL-0E-Z5gOT`P{`Si&VEQQ(5Hkcnd{*2*iD zo3;HuW?SxIH^9Wd_8{9@Z++L@I&9u%l)h_Hm5E=8N?xHea4npPtFVL+%MkbYN|N;j zR7gh&t6FTx6N2Exuq5{m+;5OUq(@<0y0X??W?ixqIHi}g9Os&uQ*bFETXtXxqmD>9Xe1>Mz^5(xML zZ{y3GSH%51+~)s#KZx$u$n3$%y%}ltQuVHFU*~rb>{dHy%Q1-Xy@)at`Jhl`27#j> zV3g$U&3=T;xzER4@<TlrJjdg(IXK+L?u75zHZ7|dZTN+DqzBQKz)rBOx9%iWu)H~u z+2|5fN?}!~P-9RwyI^lZ@{R8r{|{k*(_C4SBnx7yX6EMtk(pKfIgcE2MrJlc5mJOB zLQ?n#xZwX6F1Y4qdicnG-Cb1~fqUG|lnZmeKvciSL1$+n5dq-dbNslQsp$t{MmIPi zgE#FL>O3jzbZ5QVmA|4!oMTw~-a1e+v(J1j+i5Y!JZwu4f&U_1>fe`EU(6o6!0PIW z?A+~^mC3h>{@1V+(q6B96DqnyX%l#huo32iV_4U_Vesglcr%f=At5^~OR7rk%)7=X zbtdee1=e}*ICM3jNemnKTB}yoT^zN=F1s5@fMi6xDV{m5JLZhC#1cx)Z)EHbcMl(} z@Yo%5zfz*wXs5caYW7vT@8GqnP9C7`o&#H9(PzI5PIP!sO9gu}$S``+;lq8HUwsc+ z#Yw;+x3VlS$#QCuCS?LkTBQ`$#2xpYOjR=P7g

P3m+7UMX3wPMG0CeS+ZI*?S0 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

+(bQ%sv)nVf1EK+q+&r^BNvog; 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