{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# K means clustering\n",
    "\n",
    "Clustering is used for classification. Here we are going to work with simulated data. We are going to simulate a set of people; children, women and men. We will assume that children are small, in height and weight, women slightly larger and men larger again. We will simulate data with 20% children, 45% women and 35% men. We will assume that weight is correlated to height."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy\n",
    "children, women, men = 20, 45, 35\n",
    "sample = children + women + men\n",
    "\n",
    "height_children = numpy.random.normal(120, 15, children) / 100\n",
    "weight_children = 21.5 * height_children * numpy.random.normal(1.0, 0.05, children)\n",
    "\n",
    "height_women = numpy.random.normal(170, 5, women) / 100\n",
    "weight_women = 40.0 * height_women * numpy.random.normal(1.0, 0.1, women)\n",
    "\n",
    "height_men = numpy.random.normal(180, 5, men) / 100\n",
    "weight_men = 50.0 * height_men * numpy.random.normal(1.0, 0.1, men)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets plot the data so that we may compare to our later results in classifying our data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(height_children, weight_children, 'go')\n",
    "plt.plot(height_women, weight_women, 'ro')\n",
    "plt.plot(height_men, weight_men, 'bo')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we place all data into one large array. Thereby we loose all knowledge og categories, though we still know from the order of the points, we can use that fact later for testing. We move on to normalize the data for use in the distance function. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "raw_data = numpy.concatenate((numpy.array((height_children, weight_children)), \\\n",
    "                          numpy.array((height_women, weight_women)) , \\\n",
    "                          numpy.array((height_men, weight_men))), axis = 1)\n",
    "\n",
    "data = raw_data / numpy.max(raw_data, axis = 1)[numpy.newaxis].T #We transpose to have the data in rows\n",
    "plt.plot(data[0, :], data[1, :], 'yo')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can start trying to find the clusters. We start out by picking 3 random points and build clusters around those. This will often look good, even though we are only building random clusters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def all_dist(observation, data):\n",
    "    return numpy.sqrt((data[0, :] - observation[0])**2 + (data[1, :] - observation[1])**2)\n",
    "\n",
    "k=3\n",
    "centroids = numpy.array([data[:, numpy.random.randint(sample)] for _ in range(k)])\n",
    "distances = numpy.empty((k,sample))\n",
    "for d in range(k):\n",
    "    distances[d, :] = all_dist(centroids[d], data)\n",
    "winners = numpy.argmin(distances, axis = 0)\n",
    "clusters = [data[:, winners == i] for i in range(k)]\n",
    "for cluster, color in zip(clusters, ['go', 'ro', 'bo']):\n",
    "    plt.plot(cluster[0, :], cluster[1, :], color)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Obviously we need to itterate to make the clusters better. We do this by recalculating the center of a cluster to be the mean of the points insie the cluster for each itteration. Once the cluster centers do not change we have converged."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def cluster(data, k):\n",
    "    centroids = numpy.array([data[:, numpy.random.randint(sample)] for _ in range(k)])\n",
    "    done = False\n",
    "    while not done:\n",
    "        distances = numpy.empty((k,sample))\n",
    "        for d in range(k):\n",
    "            distances[d, :] = all_dist(centroids[d], data)\n",
    "        winners = numpy.argmin(distances, axis = 0)\n",
    "        clusters = [data[:, winners == i] for i in range(k)]\n",
    "        prev_centroids = centroids\n",
    "        centroids = numpy.array([numpy.average(cluster, axis = 1) for cluster in clusters])\n",
    "        if numpy.sum(prev_centroids-centroids) == 0:\n",
    "            done=True\n",
    "    for cluster, color in zip(clusters, ['go', 'ro', 'bo']):\n",
    "        plt.plot(cluster[0, :], cluster[1, :], color)\n",
    "    plt.show()\n",
    "\n",
    "cluster(data,3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Excersises\n",
    "1. Increase the sample size and see how that affects the algorithm.\n",
    "2. Try and add on obvious outlier; a 1m 100kg person for instance, and see what happens"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "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.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
