{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# K-Means Algorithm Demo\n", "\n", "\n", "\n", "> ☝Before moving on with this demo you might want to take a look at:\n", "> - 📗[Math behind the K-Means Algorithm](../../k-means.md)\n", "\n", "\n", "**K-means clustering** aims to partition _n_ observations into _K_ clusters in which each observation belongs to the cluster with the nearest mean, serving as a prototype of the cluster.\n", "\n", "> **Demo Project:** In this example we will try to cluster Iris flowers into tree categories that we don't know in advance based on `petal_length` and `petal_width` parameters using K-Means unsupervised learning algorithm." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# To make debugging of logistic_regression module easier we enable imported modules autoreloading feature.\n", "# By doing this you may change the code of logistic_regression library and all these changes will be available here.\n", "%load_ext autoreload\n", "%autoreload 2\n", "\n", "# Add project root folder to module loading paths.\n", "import sys\n", "sys.path.append('..')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import Dependencies\n", "\n", "- [pandas](https://pandas.pydata.org/) - library that we will use for loading and displaying the data in a table\n", "- [numpy](http://www.numpy.org/) - library that we will use for linear algebra operations\n", "- [matplotlib](https://matplotlib.org/) - library that we will use for plotting the data\n", "- [k_means](https://github.com/trekhleb/homemade-machine-learning/blob/master/homemade/k_means/k_means.py) - custom implementation of K-Means algorithm" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Import 3rd party dependencies.\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "# Import custom k-means implementation.\n", "from utils.k_means import KMeans" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load the Data\n", "\n", "In this demo we will use [Iris data set](http://archive.ics.uci.edu/ml/datasets/Iris).\n", "\n", "The data set consists of several samples from each of three species of Iris (`Iris setosa`, `Iris virginica` and `Iris versicolor`). Four features were measured from each sample: the length and the width of the sepals and petals, in centimeters. Based on the combination of these four features, [Ronald Fisher](https://en.wikipedia.org/wiki/Iris_flower_data_set) developed a linear discriminant model to distinguish the species from each other." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepal_lengthsepal_widthpetal_lengthpetal_widthclass
05.13.51.40.2SETOSA
14.93.01.40.2SETOSA
24.73.21.30.2SETOSA
34.63.11.50.2SETOSA
45.03.61.40.2SETOSA
55.43.91.70.4SETOSA
64.63.41.40.3SETOSA
75.03.41.50.2SETOSA
84.42.91.40.2SETOSA
94.93.11.50.1SETOSA
\n", "
" ], "text/plain": [ " sepal_length sepal_width petal_length petal_width class\n", "0 5.1 3.5 1.4 0.2 SETOSA\n", "1 4.9 3.0 1.4 0.2 SETOSA\n", "2 4.7 3.2 1.3 0.2 SETOSA\n", "3 4.6 3.1 1.5 0.2 SETOSA\n", "4 5.0 3.6 1.4 0.2 SETOSA\n", "5 5.4 3.9 1.7 0.4 SETOSA\n", "6 4.6 3.4 1.4 0.3 SETOSA\n", "7 5.0 3.4 1.5 0.2 SETOSA\n", "8 4.4 2.9 1.4 0.2 SETOSA\n", "9 4.9 3.1 1.5 0.1 SETOSA" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Load the data.\n", "data = pd.read_csv('../data/iris.csv')\n", "\n", "# Print the data table.\n", "data.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot the Data\n", "\n", "Let's take two parameters `petal_length` and `petal_width` for each flower into consideration and plot the dependency of the Iris class on these two parameters.\n", "\n", "Since we have an advantage of knowing the actual flower labels (classes) let's illustrate the real-world classification on the plot. But K-Means algorithm is an example of unsuervised learning algorithm which means that this algorithm doesn't need to know about labels. Thus below in this demo we will try to split Iris flowers into unknown clusters and compare the result of such split with the actual flower classification." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# List of suppported Iris classes.\n", "iris_types = ['SETOSA', 'VERSICOLOR', 'VIRGINICA']\n", "\n", "# Pick the Iris parameters for consideration.\n", "x_axis = 'petal_length'\n", "y_axis = 'petal_width'\n", "\n", "# Make the plot a little bit bigger than default one.\n", "plt.figure(figsize=(12, 5))\n", "\n", "# Plot the scatter for every type of Iris.\n", "# This is the case when we know flower labels in advance.\n", "plt.subplot(1, 2, 1)\n", "for iris_type in iris_types:\n", " plt.scatter(\n", " data[x_axis][data['class'] == iris_type],\n", " data[y_axis][data['class'] == iris_type],\n", " label=iris_type\n", " )\n", " \n", "plt.xlabel(x_axis + ' (cm)')\n", "plt.ylabel(y_axis + ' (cm)')\n", "plt.title('Iris Types (labels are known)')\n", "plt.legend()\n", "\n", "# Plot non-classified scatter of Iris flowers.\n", "# This is the case when we don't know flower labels in advance.\n", "# This is how K-Means sees the dataset.\n", "plt.subplot(1, 2, 2)\n", "plt.scatter(\n", " data[x_axis][:],\n", " data[y_axis][:],\n", ")\n", "plt.xlabel(x_axis + ' (cm)')\n", "plt.ylabel(y_axis + ' (cm)')\n", "plt.title('Iris Types (labels are NOT known)')\n", "\n", "# Plot all subplots.\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Prepara the Data for Training\n", "\n", "Let's extract `petal_length` and `petal_width` data and form a training feature set." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Get total number of Iris examples.\n", "num_examples = data.shape[0]\n", "\n", "# Get features.\n", "x_train = data[[x_axis, y_axis]].values.reshape((num_examples, 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Init and Train Logistic Regression Model\n", "\n", "> ☝🏻This is the place where you might want to play with model configuration.\n", "\n", "- `num_clusters` - number of clusters into which we want to split our training dataset.\n", "- `max_iterations` - maximum number of training iterations." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Set K-Means parameters.\n", "num_clusters = 3 # Number of clusters into which we want to split our training dataset.\n", "max_iterations = 50 # maximum number of training iterations.\n", "\n", "# Init K-Means instance.\n", "k_means = KMeans(x_train, num_clusters)\n", "\n", "# Train K-Means instance.\n", "(centroids, closest_centroids_ids) = k_means.train(max_iterations)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Plot the Clustering Results\n", "\n", "Now let's plot the original Iris flow classification along with our unsupervised K-Means clusters to see how the algorithm performed." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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eXk5ixcvZvfu3VG8axGRzOSc44ILLqCgoICPPvqIZcuWMWXKFD7//POYxp05cyZbt26t1zk1Vab98MMP6dq1K845tm7dStu2bQGvCu8f//hH1qxZw7vvvssDDzzAmjVrYopbRGLXaCfVCzYsYNDcQfR+vDeD5g5iwYYFMY138cUXs2DBAvbt2wd4JcO3bt1Khw4dIvZv3rw5eXl5bNmyBYC77rqLX//61yEf051//vmcccYZEc+fOHEid955Z60x3X333dx6662cdNJJAGRlZXHddddVHa+shjho0CDmzZvn/82KiCRZvHP2woULyc7OZsyYMVVtubm59O/fP6TfzJkzufHGG6teDxkyhEWLFlFeXs7IkSPp2bMnvXr1Ytq0acydO5eioiIuv/xy8vLy2Lt3L8uWLWPAgAH07duXc845h7KyMgAKCgq4+eabyc/PZ/r00G0Z9+7dS15eHgMHDmTRokV0796d9evXk5eXR0lJCW3btq2q7Hj44YfTvXv3qt8lInV5fvkWTv/D63T+1QJO/8PrPL+8+n87fvqkg3SLs1GWKQ8v4lC2u4zCdwoBol632apVK0455RRefPFFhg4dyuzZs7n00ksjlvgG+Pe//8369eurJs2rV6/m5z//ue/rnXrqqTz33HMsXLiQww8/PGKfVatWMWHChBrHmDNnDq+++irvv/8+999/Pz/96U99X18kk9dGh8uUOBurROTsVatW0bdv36hjKikpYcuWLaxatQqAnTt30rJlS2bMmME999xDfn4++/fvZ+zYscybN482bdowZ84cbr31Vh599FEA9u3bR/hac/BuupSUlHDDDTcwevRoVq1axa5du7jhhhuq9d24cSPLly/nBz/4QdTvRRqP8AqDW3buZdKzpQA1VkaM1CcdpGOcjfJOdaKKOAQvAZk9ezYjRoyo1mfx4sXk5ubSrl07zjnnHI45pvp2XNu3bycvL48TTzyRe+65p8br3XbbbUyePDmqWIuKimjdujUdO3bkrLPOYvny5ezYsSOqsaTxqZzklO0uw+GqJjnBdw/99EkHmRJnY5aOhXeOP/54NmzYwNixY3nppZc44ogjqvVZt24dq1at4uyzzyYvL4/JkyezefPmquPDhw+v9RqlpaXk5OSwcuVKcnNzqx3ftWsXF110Effee2/E64uEm/ryumrlz/fuL2fqy+vq1ScdpGOcjXJSnagiDkOHDuW1116juLiYPXv2RLwL0r9/f1asWMHq1av5y1/+QklJCQA5OTkUFxcDcPTRR1NSUsK1117Lrl27arzewIED2bt3L++++27E4zk5OSxbtizisVmzZvH+++/TqVMnunTpwtdff80zzzxT37csjVQmV0YMlylxNmaJyNm15cdgTZs2paKiour1t996/60cddRRrFixgoKCAh588EGuueaaauc658jJyaGkpISSkhJKS0t55ZVXqo4fdthhEa95xx13kJubS3FxMf369ePhhx/muuuuY+LEiVV99u/fz0UXXcTll1/OhRde6Pt9S+OWqZURI0nHOBvlpDpRRRxatGjBmWeeyejRoyPepQ7WuXNnfvWrX3HXXXcB8Itf/II777yTtWvXVvXZs2dPnde87bbbuPvuuyMemzhxIr///e/54IMPAKioqODBBx+koqKCp556itLSUjZu3MjGjRuZN28es2bN8vtWpZHL5MqI4TIlzsYsETl74MCBfPfddzz00ENVbStXrmTx4sUh/Tp16kRJSQkVFRVs2rSJ9957D4Bt27ZRUVHBRRddxOTJk6tuihx++OF88803AHTr1o0vv/ySJUuWAN5EePXq1XXGdvvtt/PII48watQoli5dSm5uLqWlpUydOhXwJutXX3013bt355Zbbon6ayCNT6ZWRowkHeNslJPqRBZxGDFiBCtWrKhzUg0wZswY3nzzTTZu3EivXr2YPn06V155Jd26deP0009n7dq1da5zPvfcc2nTpk3EY7179+bee+9lxIgRdO/enZ49e7JhwwYWL15Mu3btOPbYY6v6nnHGGaxZs6bqIRqR2mRyZcRwmRJnY5aInG1mPPfcc/zzn/+kS5cu5OTkMGnSpGpL8k4//XQ6d+5Mjx49uOmmm6oeENyyZQsFBQXk5eVxxRVXMGXKFABGjhzJmDFjyMvLo7y8nLlz5/LLX/6S3Nxc8vLyeOedd3zF98Ybb9C/f3/ee+89+vXrF3Ls7bff5q9//Suvv/46eXl55OXl8cILL0T9tZDGI1MrI0aSjnE22uIvejApsVRwoGELf3AMvElO4WmFVT9Hfvqkg2THqeIvHuXs5FAulnDPL9/C1JfXsXXnXo5t2ZyJ53Sr9mCfnz7pIFlx+s3bjXL3D/CeGFdCFolO5c9ObZMcP33SQabE2dgp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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# List of suppported Iris classes.\n", "iris_types = ['SETOSA', 'VERSICOLOR', 'VIRGINICA']\n", "\n", "# Pick the Iris parameters for consideration.\n", "x_axis = 'petal_length'\n", "y_axis = 'petal_width'\n", "\n", "# Make the plot a little bit bigger than default one.\n", "plt.figure(figsize=(12, 5))\n", "\n", "# Plot ACTUAL Iris flower classification.\n", "plt.subplot(1, 2, 1)\n", "for iris_type in iris_types:\n", " plt.scatter(\n", " data[x_axis][data['class'] == iris_type],\n", " data[y_axis][data['class'] == iris_type],\n", " label=iris_type\n", " )\n", "\n", "plt.xlabel(x_axis + ' (cm)')\n", "plt.ylabel(y_axis + ' (cm)')\n", "plt.title('Iris Real-World Clusters')\n", "plt.legend()\n", "\n", "# Plot UNSUPERWISED Iris flower classification.\n", "plt.subplot(1, 2, 2)\n", "for centroid_id, centroid in enumerate(centroids):\n", " current_examples_indices = (closest_centroids_ids == centroid_id).flatten()\n", " plt.scatter(\n", " data[x_axis][current_examples_indices],\n", " data[y_axis][current_examples_indices],\n", " label='Cluster #' + str(centroid_id)\n", " )\n", "\n", "# Plot clusters centroids.\n", "for centroid_id, centroid in enumerate(centroids):\n", " plt.scatter(centroid[0], centroid[1], c='black', marker='x')\n", " \n", "plt.xlabel(x_axis + ' (cm)')\n", "plt.ylabel(y_axis + ' (cm)')\n", "plt.title('Iris K-Means Clusters')\n", "plt.legend()\n", "\n", "# Show all subplots.\n", "plt.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.7.0" } }, "nbformat": 4, "nbformat_minor": 2 }