{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# kmeans" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T14:49:21.980985", "start_time": "2016-07-03T14:49:21.967200" }, "collapsed": false, "scrolled": false }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from matplotlib import animation as ani\n", "import seaborn as sns\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2017-01-15T15:46:53.929421", "start_time": "2017-01-15T15:46:52.482846" }, "collapsed": true }, "outputs": [], "source": [ "# k-means\n", "from sklearn import cluster\n", "from sklearn import preprocessing" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T13:22:47.357366", "start_time": "2016-07-03T13:22:47.335787" }, "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "iris = sns.load_dataset(\"iris\")\n", "le = preprocessing.LabelEncoder()\n", "le.fit_transform(iris.species)\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T13:22:53.376723", "start_time": "2016-07-03T13:22:53.231269" }, "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Initialization complete\n", "Iteration 0, inertia 67.390\n", "Iteration 1, inertia 46.036\n", "Iteration 2, inertia 43.245\n", "Iteration 3, inertia 39.989\n", "Iteration 4, inertia 37.769\n", "Iteration 5, inertia 37.200\n", "Iteration 6, inertia 37.147\n", "Iteration 7, inertia 37.100\n", "Iteration 8, inertia 37.086\n", "Converged at iteration 8\n", "Initialization complete\n", "Iteration 0, inertia 51.920\n", "Iteration 1, inertia 37.765\n", "Iteration 2, inertia 37.063\n", "Iteration 3, inertia 37.051\n", "Converged at iteration 3\n", "Initialization complete\n", "Iteration 0, inertia 62.230\n", "Iteration 1, inertia 46.873\n", "Iteration 2, inertia 40.701\n", "Iteration 3, inertia 38.881\n", "Iteration 4, inertia 38.221\n", "Iteration 5, inertia 37.817\n", "Iteration 6, inertia 37.351\n", "Iteration 7, inertia 37.063\n", "Iteration 8, inertia 37.051\n", "Converged at iteration 8\n", "Initialization complete\n", "Iteration 0, inertia 54.320\n", "Iteration 1, inertia 47.605\n", "Iteration 2, inertia 43.791\n", "Iteration 3, inertia 40.970\n", "Iteration 4, inertia 38.957\n", "Iteration 5, inertia 38.221\n", "Iteration 6, inertia 37.817\n", "Iteration 7, inertia 37.351\n", "Iteration 8, inertia 37.063\n", "Iteration 9, inertia 37.051\n", "Converged at iteration 9\n", "Initialization complete\n", "Iteration 0, inertia 51.670\n", "Iteration 1, inertia 38.183\n", "Iteration 2, inertia 37.476\n", "Iteration 3, inertia 37.101\n", "Iteration 4, inertia 37.063\n", "Iteration 5, inertia 37.051\n", "Converged at iteration 5\n", "Initialization complete\n", "Iteration 0, inertia 73.500\n", "Iteration 1, inertia 52.003\n", "Iteration 2, inertia 49.497\n", "Iteration 3, inertia 47.448\n", "Iteration 4, inertia 45.700\n", "Iteration 5, inertia 44.161\n", "Iteration 6, inertia 43.045\n", "Iteration 7, inertia 40.095\n", "Iteration 8, inertia 38.468\n", "Iteration 9, inertia 37.935\n", "Iteration 10, inertia 37.430\n", "Iteration 11, inertia 37.193\n", "Iteration 12, inertia 37.063\n", "Iteration 13, inertia 37.051\n", "Converged at iteration 13\n", "Initialization complete\n", "Iteration 0, inertia 53.330\n", "Iteration 1, inertia 41.359\n", "Iteration 2, inertia 39.876\n", "Iteration 3, inertia 38.468\n", "Iteration 4, inertia 38.251\n", "Iteration 5, inertia 38.074\n", "Iteration 6, inertia 37.999\n", "Iteration 7, inertia 37.878\n", "Iteration 8, inertia 37.802\n", "Iteration 9, inertia 37.714\n", "Iteration 10, inertia 37.654\n", "Iteration 11, inertia 37.439\n", "Iteration 12, inertia 37.328\n", "Iteration 13, inertia 37.260\n", "Iteration 14, inertia 37.147\n", "Iteration 15, inertia 37.100\n", "Iteration 16, inertia 37.086\n", "Converged at iteration 16\n", "Initialization complete\n", "Iteration 0, inertia 70.220\n", "Iteration 1, inertia 49.673\n", "Iteration 2, inertia 47.651\n", "Iteration 3, inertia 45.908\n", "Iteration 4, inertia 44.658\n", "Iteration 5, inertia 44.004\n", "Iteration 6, inertia 42.193\n", "Iteration 7, inertia 39.743\n", "Iteration 8, inertia 38.221\n", "Iteration 9, inertia 37.817\n", "Iteration 10, inertia 37.351\n", "Iteration 11, inertia 37.063\n", "Iteration 12, inertia 37.051\n", "Converged at iteration 12\n", "Initialization complete\n", "Iteration 0, inertia 54.410\n", "Iteration 1, inertia 43.316\n", "Iteration 2, inertia 39.994\n", "Iteration 3, inertia 38.334\n", "Iteration 4, inertia 38.171\n", "Iteration 5, inertia 37.999\n", "Iteration 6, inertia 37.878\n", "Iteration 7, inertia 37.802\n", "Iteration 8, inertia 37.714\n", "Iteration 9, inertia 37.654\n", "Iteration 10, inertia 37.439\n", "Iteration 11, inertia 37.328\n", "Iteration 12, inertia 37.260\n", "Iteration 13, inertia 37.147\n", "Iteration 14, inertia 37.100\n", "Iteration 15, inertia 37.086\n", "Converged at iteration 15\n", "Initialization complete\n", "Iteration 0, inertia 51.720\n", "Iteration 1, inertia 41.585\n", "Iteration 2, inertia 39.876\n", "Iteration 3, inertia 38.468\n", "Iteration 4, inertia 38.251\n", "Iteration 5, inertia 38.074\n", "Iteration 6, inertia 37.999\n", "Iteration 7, inertia 37.878\n", "Iteration 8, inertia 37.802\n", "Iteration 9, inertia 37.714\n", "Iteration 10, inertia 37.654\n", "Iteration 11, inertia 37.439\n", "Iteration 12, inertia 37.328\n", "Iteration 13, inertia 37.260\n", "Iteration 14, inertia 37.147\n", "Iteration 15, inertia 37.100\n", "Iteration 16, inertia 37.086\n", "Converged at iteration 16\n" ] }, { "data": { "text/plain": [ "KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=3, n_init=10,\n", " n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001,\n", " verbose=1)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clf = cluster.KMeans(n_clusters=3, verbose=1)\n", "clf.fit(iris[[\"sepal_length\", \"sepal_width\"]], iris.species)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T13:23:01.685259", "start_time": "2016-07-03T13:23:01.677936" }, "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['cluster_centers_', 'inertia_', 'labels_', 'n_iter_']" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[a for a in dir(clf) if not a.startswith(\"_\") and a.endswith(\"_\")]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T13:23:02.652686", "start_time": "2016-07-03T13:23:02.647449" }, "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "(37.050702127659569, 4)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clf.inertia_, clf.n_iter_" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T13:23:03.742553", "start_time": "2016-07-03T13:23:03.736204" }, "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 5.006 , 3.428 ],\n", " [ 6.81276596, 3.07446809],\n", " [ 5.77358491, 2.69245283]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clf.cluster_centers_" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T13:24:55.526142", "start_time": "2016-07-03T13:24:54.408520" }, "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nr7bz6pPE1q1b8frrr8Nms7ke69SpEz799FMZUYmIyJOIMBN63ezfYHVdBoNB1hxAXn1+eeedd7B7\n926MHj0an376KV555RXXrEhERNRweX3vpptuugm33norTp8+jfHjx2Pr1q1qZwsqcprwpLZRugmP\n/Kd041l1bTXezN6EYlsJYppE44lfP4KwEOnJ6eVsQ+QPr37CmzRpgiNHjuDWW2/F559/jpKSEpSX\nl6udLag4m9xO519CZnYBDn/j+fvmUts4m/B+/KkKWbnFeHd/rprxyQvOxrO8S2fwZcFXOFL0tV/7\nezN7E86Un0NlTRXOlJ/Dm9mbVNmGyB9eFYmXXnoJmZmZGDRoEC5duoSRI0di2rRpamcLKnKa3KS2\nUboJj/yndONZsa1EclmpbYj84VWRuOWWW/DCCy/g5MmTmDt3LrKysjBz5kyVowUXOU1uUtso3YRH\n/lO68SymSbTkslLbEPnDqzGJw4cPY8GCBYiJiYHD4UB5eTneeOMNDl7XIacJT2obpZvwyH9KN549\n8etHbhhfUGMbIn8YBC96vRMSEpCamooePa79ofr222+xdOlSZGRkqB7wenpoINNDI5seMjCH/jLo\nJYceMugth14cP34cqamp2LJli1fP9+qTRFhYmKtAAMCvfvUrr3bucDiwePFinDlzBkajEcuWLcPN\nN9/sWp+ZmYkNGzbAZDJhwoQJsFgsXu2XiKgxuGqvhskYghBjiCL727RpE3bv3o3ISO/v+eZVkejV\nqxdefPFFTJo0CSEhIdi3bx86duyIrKwsAEC/fvW39WdmZsJgMGD79u04duwYXn/9ddetae12O1at\nWoWMjAyEh4cjMTERw4cPR+vWrb0OT0TUEAmCgJ05+/B/hd8i1GjCw796EHe09f+Sc2xsLNavX48X\nXnjB6228KhJ5eXkAgNTUVLfH165dC4PBIHqTvxEjRmDYsGEAgIKCArRo0cJtn7GxsTCbrw3I9u3b\nF1lZWbj//vu9Di+XVH+C3EmH5JDqhRDLoeWkQ3In+3HY7SjeshlXz59HeOfOiEmaCaPJpPj+6mas\nKC2GIyrGtU+pbZTm7F24ePUi2oS3cetdkOqt8DSJkZITAYntU8tJh+ROptQYnSz5D/6v8FsAQI3D\njp05+3B7zK1+T/J23333oaCgwKdtvPqt8fbaVX2MRiMWLlyIzz77DGvXrnU9fv1tayMjI1FRoc21\nQ6mJheROOiSH1IREYjm0nHRI7mQ/xVs2oyLrGACg+sK12x23+90jiu+vbsZrE+1859qn1DZKc/Yu\nAEDF1Uq8mb0Jz971OADpSX08TWJU3zZyie1Ty0mH5E6m1BhdsV91W66urYFDcCDEoMxlJ194VSQK\nCgqwePFiFBQUYNu2bXj22WexcuVKdPLyvv6rVq1CaWkpLBYL9u/fj4iICJjNZlitv3z3v7KyEs2b\nN/e4LyUGgEorqxFqMrotO/crtU7pHEVlVW7vDIrKqjzmqPt4qMkomk8JFaXFMJl++aE0lhZ7dS4K\nCgvcXldtYQGio5t5vb/rie3v+owmU4hrn1LbKO3i1Ys3LDuPVZZf6vaayxylrnU/XrkA1Mn445UL\niI5uJrmNt65/vtg+lTiWvxk8rVM6RzDoGX0zYiLboLjy2s/WvZ37KTYuAcCnuSm8KhJLlixBcnIy\nUlNT0aZNGyQkJGDBggXYtm2b5Ha7d+/GhQsXMHv2bISHh8NoNLruXx4XF4dz586hvLwcERERyMrK\nQnJysscsSnxTISoyzPUu3Lns3K/UOielvjHRvlVT5F+wui17yuF83PlJor58SnFExbjenTuXvTkX\nIR06QqjzkTakQ0eUlFR4tb/6iO2vbsZrnyRqXfuU2kZpbcLboOJqpduy81itjFGuqUSdy8517SLa\norD8R9e6dhFtUVJSIbmNN+r7PxHbp7/HUiKDp3VK5wgEXwtVRGgE5v5mBv5degZNQ5ugW+vOiubx\n5bKVV1+BHT9+PDIyMjB27Fj87W9/AwA89NBD2L17t+R2NpsNKSkpuHjxIux2O2bPno2qqirYbDZY\nLBZ88cUXWLduHQRBwMSJE5GYmOgxsBL/4f6OSSj1g9cQxiTqOxeBGJMwckzCpd7/E43HJHzJ4Gmd\n0jkCIRg/zTh5VSSmTJmC119/HXPmzMGuXbvwz3/+E6tXr8bOnTu1yOhGL//hgc6hhwzMob8Mesmh\nhwx6yxGsvHprlZKSgt///vc4f/48HnroIVy+fBn/8z//o3Y2IiIKMK8+zwmCgAcffBA7duxAixYt\nUFVVhR9//NHzhkREFNS8KhIrVqxA7969kZubC7PZjN27d2Pjxo1qZyMiogDz6nKTw+FAv3798Oyz\nz+K3v/0t2rdvj9raWrWzBYSWzXQNldgAtdyBa2+OdX0zndSxpNYpPbgazE1iwZydlONVkWjSpAne\neecdHD16FEuWLMG7777r070/gomWzXQNlVjTnNxmOm+OdX0zndSxpNYp3fAVzE1iwZydlOPV24LU\n1FRUVVVh7dq1aNGiBYqLi/Haa6+pnS0g5EweRO6u5ufXuyz2uNbHklonNbGQnEmHlJ6oSEvBnJ1u\nZLfb8cILL2Dq1KmYNGkSMjMzvdrOqyLRtm1bzJs3D3369AEAPP/882jXrp38tDomZ/Igchd+XSe+\nc1nsca2PJbVOamIhOZMOKT1RkZaCOXtDUXv1KgSFLu3v2bMHrVq1wrZt2/D222/j5Zdf9mo7dbqL\ngpicyYPIXfN77gUAt2v+Uo8rcay6zXSejiW1TmpiITmTDik9UZGWgjl7sBMEAT+8twM/ZX0NY6gJ\nnacmomUv76ZoEDNq1CiMHDkSwLVxZpOXzaVeNdPpiV4aYwKdQw8ZmEN/GfSSQw8Z9JbDF5dzcnDm\nT++6lkPCw3DHypf9vgsscO3mqo8//jgmT56M0aNHe3w+v6pARKQztbYrbsuOmhrA4RB5tveKioow\nY8YMjBs3zqsCAbBIEBHpTovbeyKibYxrOXrwIBhC/LsL7MWLF5GcnIznn38e48aN83o7jkmQ4sT6\nELy5UZ9SPRRyjyW1ztMN+cryS9HKGOV3P0Ew9CconTEYXrOWQpo0wS1PP4GKU6dhioyEOa6b3/tM\nS0tDeXk5NmzYgPXr18NgMGDTpk0ICwuT3I5FghQn1ofgzeRB128jl9xjSa3zNEnQtV6Na7e79qef\nIBj6E5TOGAyvWWsh4eF+D1bX9eKLL+LFF1/0ebvGW6pJNaK9C+fPuz9eZ1npHgq5x5Jal28tdFvn\nXFa6nyAY+hMa42turFgkSHGivQud3SdOqbusdA+F3GNJretkdu+8dy4r3U8QDP0JjfE1N1a83ESK\nE+tDiEmaee3xOuMEnraRS+6xpNYl9hgPAG5jEsAv/QRljl/GJPwRDP0JSmcMhtfcWLFPQgY9fPda\nDxmYQ38Z9JJDDxn0liNY8XITERGJYpEgIiJRLBJERCSKA9eNhBoT/ih5LPuVKzi/fAlqy8oQ0qoV\nOi9ZDlNEhNfHun7SITWys+GLGiMWiUZCjQl/lDzW+eVLYC8uBgDYi4txfvkSdFu5xutjXT/pkBrZ\n2fBFjRHfBjUSakz4o+SxasvKJJeVPJbc/bHhixojFolGQo0Jf5Q8VkirVpLLSh5L7v7Y8EWNES83\nNRJqTPij5LE6L1l+w5iEL8e6ftIhueROSETUULGZTgY9NOjoIQNz6C+DXnLoIYPecgQrXm4iIiJR\nLBJERCTF6T5hAAARmElEQVSKRYKIiERx4JpkkdPEJndGOH/yadE8SP5jo6J+sUiQLHKa2OTOCOdP\nPqX2R+pio6J+sVSTLHKa2OTOCCeHls2D5D82KuoXiwTJIqeJTe6McHJo2TxI/mOjon7xchPJIqeJ\nTe6McP7k06J5kPzHRkX9YpEgWQxGI1rcO9inZiXnNr6u8ycfBQejwcgxCJ1StUjY7XYsWrQIBQUF\nqKmpwWOPPYZhw4a51m/evBkffPABWrduDQBYvnw5unTpomYkIiLygapFYs+ePWjVqhXWrFmDy5cv\nY+zYsW5FIicnB2vWrEHPnj3VjEFERDKpWiRGjRqFkSNHAgAcDgdMJvfD5eTkIC0tDSUlJYiPj8fs\n2bPVjBNU5HzPPxATC9XXJyGWIxh6Fxx2O4q3bMbV8+cR3rkzYpJmwmhS59eEvQEUDFQtEk2aNAEA\nWK1WPPXUU3jmmWfc1j/wwAOYOnUqzGYz5s6diwMHDmDIkCFqRgoacr7nH4iJherrkxDLEQy9C8Vb\nNqMi6xgAoPrCjwCAdr97RJVjsTeAgoHqA9dFRUWYN28epk2bhtGjR7utmzFjBsxmMwBgyJAhOHHi\nhMcioZe7Kaqdo6K0GCZTiGvZWFp8wzGvX/ZmGzXymUwhbscSy6F2PiX2VVBYAIPB4FquLSzwab++\nPLcsv9TtfJQ5ShU7H3r4PdFDBkA/OYKVqkXi4sWLSE5OxpIlS9C/f3+3dVarFQkJCfjwww8RERGB\nI0eOYOLEiR73qZfb/qqdwxEV43qH7lyue8z6MnjaRo181z5J1LodSyyHmvmU+j8J6dARQkGB27K3\n+/U1QytjFOz2U27LSrwGPdweWw8Z9JYjWKlaJNLS0lBeXo4NGzZg/fr1MBgMmDRpEmw2GywWC+bP\nn4+kpCSEh4djwIABGDxYX5ceAknO9/wDMbFQfX0SYjmCoXchJmkmALiNSaiFvQEUDDjpkAx6eHei\nhwzMob8Mesmhhwx6yxGs+FUKIiISxSJBRESiWCSIiEgU792kU3pvPHM2nRUUFiCkQ0dVm86IKHD4\nW61Tem88czadGQwG11dG1Wo6I6LA0c9bU3Kj90lzrp4/L7lMRA0Di4RO6X3SnPDOnSWXiahh4OUm\nndJ745mzyay2zpgEETU8LBI6pfdJc4wmE9r97hHdNCsRkTp4uYmIiESxSBARkShebvKBQxBw+Jsi\nlFZWIyoyDAN7tYexzm2ltSA12U9jzKE0vfenEGmNRcIHh78pQmZ2AUJNRtTYHQCAQb07aJpBarKf\nxphDaXrvTyHSGt8i+SC/pFJyWQt66Z/QSw6lNdTXRSQXi4QPOkVHSi5rQS/9E3rJobSG+rqI5OLl\nJh8M7NUeANzGJLQmNdlPY8yhNL33pxBpjUXCB0aDAYN6dwhob4CzfyLQ/Ql6yaE0vfenEGmNl5uI\niEgUiwQREYlikSAiIlEck6CgJmfyIzbMEXmPRYKCmpzJj9gwR+Q9vn2ioCZn8iM2zBF5j0WCgpqc\nyY/YMEfkPV5uoqAmZ/IjNswReY9FgoKanMmP2DBH5D1ebiIiIlEsEkREJIpFgoiIRLFIEBGRKBYJ\nIiISxSJBRESiWCSIiEgUiwQREYlikSAiIlGqdlzb7XYsWrQIBQUFqKmpwWOPPYZhw4a51mdmZmLD\nhg0wmUyYMGECLBaLmnGIiMhHqhaJPXv2oFWrVlizZg0uX76MsWPHuoqE3W7HqlWrkJGRgfDwcCQm\nJmL48OFo3bq1mpGIiMgHqhaJUaNGYeTIkQAAh8MBU53JYPLy8hAbGwuz2QwA6Nu3L7KysnD//fer\nGSnoOSfMqSgthiMqhhPmEJGqVC0STZo0AQBYrVY89dRTeOaZZ1zrrFYrmjVr5lqOjIxERYV3N2hr\nzJwT5phMIbDbvwPACXOISD2q3wW2qKgI8+bNw7Rp0zB69GjX42azGVar1bVcWVmJ5s2be9xfdHQz\nj8/RQqByVJQWw2QKAQCYTCEwlhYH/JwE+vhOesihhwyAPnLoIQOgnxzBStUicfHiRSQnJ2PJkiXo\n37+/27q4uDicO3cO5eXliIiIQFZWFpKTkz3u09vbQavJl9tSK80RFQO7/bufP0nUwhEVE9BzEshz\nobccesiglxx6yKC3HMFK1SKRlpaG8vJybNiwAevXr4fBYMCkSZNgs9lgsViQkpKCWbNmQRAEWCwW\nxMTEqBmnQXBOkGOsMyZBRKQWgyAIQqBD+EIv7woCnUMPGZhDfxn0kkMPGfSWI1jxazFERCSKRYKI\niESxSBARkSgWCSIiEsUiQUREolgkiIhIFIsEERGJYpEgIiJRLBJERCSKRYKIiESxSBARkSgWCSIi\nEsUiQUREolgkiIhIFIsEERGJYpEgIiJRLBJERCSKRYKIiESxSBARkSgWCSIiEsUiQUREolgkiIhI\nFIsEERGJYpEgIiJRLBJERCSKRYKIiESxSBARkSgWCSIiEsUiQUREolgkiIhIFIsEERGJYpEgIiJR\nLBJERCSKRYKIiESxSBARkSjVi8Tx48eRlJR0w+ObN29GQkICpk+fjunTp+Ps2bNqRyEiIh+Z1Nz5\npk2bsHv3bkRGRt6wLicnB2vWrEHPnj3VjEBERH5Q9ZNEbGws1q9fX++6nJwcpKWlYcqUKdi4caOa\nMYiISCZVi8R9992HkJCQetc98MADWLZsGdLT0/H111/jwIEDakYhIiIZVL3cJGXGjBkwm80AgCFD\nhuDEiRMYMmSIx+2io5upHc0resihhwwAc+gtA6CPHHrIAOgnR7DS5NtNgiC4LVutViQkJMBms0EQ\nBBw5cgS33367FlGIiMgHmnySMBgMAIC9e/fCZrPBYrFg/vz5SEpKQnh4OAYMGIDBgwdrEYWIiHxg\nEK5/m09ERPQzNtMREZEoFgkiIhLFIkFERKIC9hVYT0pLSzFhwgT8+c9/RteuXV2PZ2ZmYsOGDTCZ\nTJgwYQIsFktAcmzevBkffPABWrduDQBYvnw5unTpokqG8ePHu74u3KlTJ6xcudK1TqvzIZVBy3Ox\nceNGZGZmoqamBlOmTMGECRNc67T82ZDKocX52LVrFzIyMmAwGHD16lXk5ubi8OHDrv8jrc6Fpxxa\nnAu73Y4FCxagoKAAJpMJL7/8ckD+ZnjKoeXviaIEHaqpqRHmzp0r3H///cL333/v9vh9990nVFRU\nCNXV1cKECROE0tJSzXMIgiA899xzQk5OjmrHdrp69aowbtw40XxanA+pDIKg3bk4evSo8NhjjwmC\nIAiVlZXCm2++6Vqn5c+GVA5B0O58OC1btkzYsWOHa1nr3xOxHIKgzbn47LPPhKeffloQBEE4fPiw\n8MQTT7jWaXkupHIIgvY/F0rR5eWm1atXIzExETExMW6P5+XlITY2FmazGaGhoejbty+ysrI0zwFo\nd1uR3NxcVFVVITk5GTNnzsTx48dd67Q6H1IZAO3OxaFDh9C9e3c8/vjjmDNnDoYOHepap+XPhlQO\nQNtbznz77bf4z3/+4/buWOvfE7EcgDbnokuXLqitrYUgCKioqEBoaKhrnZbnQioHELy3ItLd5aaM\njAxERUVh4MCB+OMf/+i2zmq1olmzX7onIyMjUVFRoXkO4NptRaZOnQqz2Yy5c+fiwIEDXnWM+yoi\nIgLJycmwWCw4e/YsHn30UXz88ccwGo2anQ+pDIB256KsrAyFhYVIS0vDDz/8gDlz5uCjjz4CoO3P\nhlQOQLvzAVy77DVv3jy3x7Q8F1I5AG3ORWRkJPLz8zFy5EhcunQJaWlprnVangupHIC2PxdK0t0n\niYyMDBw+fBhJSUnIzc3FggULUFpaCgAwm82wWq2u51ZWVqJ58+aa5wCu3VakZcuWMJlMrtuKqKFL\nly4YM2aM698tW7ZESUkJAO3Oh1QGQLtz0bJlSwwaNAgmkwldu3ZFeHg4fvrpJwDa/mxI5QC0Ox8V\nFRU4e/Ys7r77brfHtTwXUjkAbc7F5s2bMWjQIHz88cfYs2cPFixYgOrqagDangupHIB2PxdK012R\n2Lp1K7Zs2YItW7agR48eWL16NaKiogAAcXFxOHfuHMrLy1FdXY2srCzceeedmufQ8rYif/3rX7Fq\n1SoAwIULF1BZWYno6GgA2p0PqQxanou+ffviyy+/dOW4cuUKWrVqBUDbnw2pHFqej6ysLPTv3/+G\nx7U8F1I5tDoXLVq0cA2UN2vWDHa7HQ6HA4C250IqRzDfikjXHdfTp0/HsmXLkJOT47qdxxdffIF1\n69ZBEARMnDgRiYmJAcmxZ88epKenu24rUt9HbSXU1NQgJSUFhYWFMBqNeO6555Cfn6/p+fCUQatz\nAQCpqak4cuQIBEHA/PnzUVZWFpCfDakcWp2PP/3pTwgNDcX06dMBuN/2RstzIZVDi3NRVVWFRYsW\noaSkBHa7HdOnT4cgCJqfC085tPw9UZKuiwQREQWW7i43ERGRfrBIEBGRKBYJIiISxSJBRESiWCSI\niEgUiwQREYlikaBGYd26dVi3bp3kc4YNG4bCwkJFj5uSkoKioiLV9k+kNhYJop8552JX0tGjR+Fs\nRVJj/0Rq090N/qjxunDhAp577jnYbDYYjUYsXrwYBoMBr776quvWF8uXL0fHjh2RlJSEuLg4fPPN\nN6iurkZKSgoGDhyIf//733j55Zdhs9lQWlqKWbNmYdq0aV4d3/nH3OFwYM2aNTh27BgcDgfGjRuH\nGTNm4NixY0hLS0NERATy8vJw66234rXXXoPJZEJ6ejq2bduG5s2bo2vXrujcuTPCwsJQXFyM2bNn\nY+vWrRAEAevWrcPJkydx5coVrF69Gr169VLzlBL5jUWCdGPnzp0YOnQoZs2ahaysLBw7dgx///vf\nkZaWhnbt2uHQoUNYvHgx/vznPwO4druQjIwM5Obm4pFHHsEXX3yBnTt34vHHH0f//v3xww8/4KGH\nHvK6SDjt2LEDBoMBGRkZqK6uRnJyMu644w4AQHZ2Nj766CNER0dj0qRJOHToENq3b4/t27dj165d\nMJlMSEpKQufOnTF79my89957ePvtt9GyZUsAQPfu3bFy5Ups27YN77zzDt544w1lTyKRwlgkSDfu\nuecePPnkk8jJyUF8fDyGDBmC9evXY86cOa53+VVVVa7nT5o0CQDQo0cPxMTE4NSpU1i4cCG+/PJL\nbNy4EadOnYLNZvP6+M7LQV999RVOnTqFf/zjHwAAm82G06dPIy4uDt27d3fNLxIXF4dLly7h7Nmz\niI+PR9OmTQFcuyV0eXm5a79173wzfPhwAMDNN9+MTz75xOdzRKQ1FgnSjT59+mDfvn34/PPP8eGH\nH2Lnzp3o3Lkzdu3aBeDaH9uLFy+6nh8SEuL6t8PhQEhICJ566im0bNkSQ4cOxejRo7F//36fczgc\nDjz//PMYMWIEgGvzR0RGRuJf//oXwsLCXM9zFhWj0ei626cnzswGgwG8bRoFAw5ck27813/9F/72\nt79h7NixeOmll5Cbm4vLly/jn//8J4Brl6OeffZZ1/P37dsH4NqsaOXl5ejevTu++uorPPnkkxg2\nbBiOHTsGAF7/MXY+r3///nj//fdht9tRWVmJKVOm3DAbX10DBgzAwYMHUVlZierqanzyySeuAmIy\nmVBbW+v7ySDSCX6SIN1ISkrCs88+i127diEkJAQvv/wy2rVrhxUrVqC6uhpmsxmrV692PT8/Px/j\nx48HALzxxhswGo144oknkJiY6BpA7tSpE/Lz8706vvMP++TJk3Hu3DmMGzcOtbW1mDhxIvr16+cq\nOte75ZZbMG3aNEyePBlNmzZFq1atEBERAQCIj4/Ho48+ik2bNvHbTRSUeKtwCkpJSUl48skn0a9f\nv0BHwdmzZ/HFF19g5syZAIDHH38ckyZNQnx8fEBzESmBnyQoKMl9Vz59+nS3OY4FQYDBYMDkyZPx\n8MMPy9pnhw4d8O233+LBBx+EwWDAvffeywJBDQY/SRARkSgOXBMRkSgWCSIiEsUiQUREolgkiIhI\nFIsEERGJYpEgIiJR/w8FiwDE6UE8WgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAakAAAFdCAYAAAC5L5JUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtAFPXaB/DvLstFWVRA8JqXKCUr9aR2NEJI7aRGZiom\nKlJSlkk37byIqR2pfNWIOl7DUx3zkqWFaV7SjOO1o5KvmqFokTdABRGFhVVYdt4/aDdW2WFZZoZZ\n+H7+0ZnZmXl2dvXZuTy/RyMIggAiIiIV0tZ3AERERPYwSRERkWoxSRERkWoxSRERkWoxSRERkWox\nSRERkWrp5N7BiBEjoNfrAQDt27fH3LlzrcvS0tKwdOlS6HQ6jBw5EpGRkXKHQ0RELkTWJFVWVgYA\nWLly5W3LTCYT5s2bh9TUVHh6eiIqKgoDBw6En5+fnCEREZELkfVyX2ZmJkpLSxEbG4tnnnkGx44d\nsy7LyspCx44dodfr4e7ujl69eiE9PV3OcIiIyMXIeibl5eWF2NhYREZG4uzZs3j++eexfft2aLVa\nGAwG+Pj4WF/r7e2N4uJiOcMhIiIXI2uS6tSpEzp27Gj9e4sWLZCfn49WrVpBr9fDYDBYX1tSUoJm\nzZqJbk8QBGg0GjlDJiIiFZE1SX399dc4ffo03nrrLVy+fBklJSUICAgAAAQFBeHcuXMoKiqCl5cX\n0tPTERsbK7o9jUaD/Pz6PdsKCPBhDIyBMTAGuzGQtGRNUqNGjUJCQgLGjh0LrVaLuXPnYuvWrTAa\njYiMjERCQgImTpwIQRAQGRmJwMBAOcMhIiIXI2uScnd3R1JSks28nj17Wv8eHh6O8PBwOUMgIiIX\nxmJeIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYp\nIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJS\nLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYp\nIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLSYpIiJSLdmTVEFBAcLDw3HmzBmb+StW\nrEBERAQmTJiACRMm4OzZs3KHQkRELkYn58ZNJhPeeusteHl53bYsIyMDCxYsQLdu3eQMgYiIXJis\n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\nqt6TUppYw8HGFIPU1FyXRtTYMUk5SKvRILRH23qtD7LUTzX2GKSm5ro0osaOl/uIiEi1mKSIiEi1\nmKSIiEi1eE+KXE5FhQlHt62B6VIOdK3boeeQcXBzE/8qs2CXyDUxSZHLObptDUz7DkCj0cD02wUc\nBdArIkZ0HRbsErkm/pQkl3Mj+4LodHVYsEvkmpikyOV4tb9DdLo6LNglck283Ecup+eQcTgK2NyT\nqgkLdolcE5MUuRw3Nx16RcTUqqCYBbtEromX+4iISLWYpIiISLWYpIiISLWYpIiISLWYpIiISLWY\npIiISLWYpIiISLWYpIiISLWYpIiISLVkHXHCZDJhxowZyMnJQXl5OV588UUMGDDAujwtLQ1Lly6F\nTqfDyJEjERkZKWc4RETkYmRNUps2bYKvry8WLFiA69evY/jw4dYkZTKZMG/ePKSmpsLT0xNRUVEY\nOHAg/Pz85AyJiIhciKxJasiQIRg8eDAAwGw2Q6f7c3dZWVno2LEj9Ho9AKBXr15IT0/HY489JmdI\nLs3SuK8wuwC+Wn827iOiBk/WJNWkSRMAgMFgwKuvvorXX3/dusxgMMDHx8c67e3tjeJixwYLbaws\njft0OjeYTKcAsHEfETVsso+CfvHiRcTFxWH8+PEYOnSodb5er4fBYLBOl5SUoFmzZjVuLyDAp8bX\nyK2+YijMLoBO5wYA0OncUGguqNfj0Zg/C8bAGEgZsiapK1euIDY2FrNnz0bfvn1tlgUFBeHcuXMo\nKiqCl5cX0tPTERsbW+M2HW3NIJfatIeQmq/WHybTqT/OpCrgq/Wvt1jq8zgwBsag5hhIWrImqZSU\nFBQVFWHp0qVYsmQJNBoNRo8eDaPRiMjISCQkJGDixIkQBAGRkZEIDAyUMxyXZ2nUV2j+854UEVFD\nphEEQajvIGpDDb+UGANjYAyMwV4MJC0+GkZERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVE\nRKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrF\nJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVE\nRKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrFJEVERKrF\n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\nAgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "iris_kmeans = iris.copy()\n", "iris_kmeans[\"species\"] = clf.labels_\n", "sns.lmplot(data=iris_kmeans, x=\"sepal_length\", y=\"sepal_width\", hue=\"species\", fit_reg=False)\n", "sns.lmplot(data=iris, x=\"sepal_length\", y=\"sepal_width\", hue=\"species\", fit_reg=False)\n" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from scipy.spatial import distance" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.4142135623730951" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "distance.euclidean([0, 0], [1, 1])" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.4142135623730951" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# http://stackoverflow.com/questions/1401712/how-can-the-euclidean-distance-be-calculated-with-numpy\n", "np.linalg.norm(np.array([0, 0]) - np.array([1, 1]))\n" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2, 1)" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmin.html\n", "np.argmin([2,3,1]), np.argmax([2,3,1])" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[4, 5, 6],\n", " [1, 2, 3]])" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reshaped = np.array([4,5,6,1,2,3]).reshape(2, 3)\n", "reshaped" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(3, 2)" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.argmin(reshaped), np.argmax(reshaped)\n", "# flattenしたときのIndex" ] }, { "cell_type": "code", "execution_count": 279, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[False False False False False]\n", "[False False False True True]\n" ] }, { "data": { "text/plain": [ "array(['a', 1, 'b', nan, None], dtype=object)" ] }, "execution_count": 279, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "print(pd.isnull(np.array(['a', 1, 'b', np.nan, np.nan])))\n", "print(pd.isnull(np.array(['a', 1, 'b', np.nan, None])))\n", "np.array(['a', 1, 'b', np.nan, None])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# ランダムにクラスタとなるデータをK個選ぶ\n", "# 各データは、K個のデータうち、一番近いクラスタに属させる\n", "# クラスタ内の重心を変更する" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T20:43:11.967182", "start_time": "2016-07-03T20:43:11.950633" }, "collapsed": false }, "outputs": [], "source": [ "import collections\n", "\n", "def kmeans(data, n_cluster=3, max_iter=300, random_state=None, verbose=None):\n", " # 初期化\n", " centroids = init_centroids(data, random_state)\n", " \n", " # 所属クラスタ\n", " old_centroids = centroids\n", " old_clusters = np.zeros(len(data))\n", " \n", " for i in range(max_iter):\n", " new_clusters = clusters(data, centroids)\n", " if verbose:\n", " print(i, collections.Counter(new_clusters), centroids)\n", "\n", " centroids = move_centroids(data, n_cluster, new_clusters)\n", " if old_centroids == centroids:\n", " print(\"old_centroids == centroids\")\n", " print(old_centroids)\n", " print(centroids)\n", " break\n", " old_centroids = centroids\n", " return new_clusters" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T14:18:56.525975", "start_time": "2016-07-03T14:18:56.519868" }, "collapsed": true }, "outputs": [], "source": [ "def init_centroids(data, random_state):\n", " np.random.seed(random_state)\n", " centroids_idx = np.random.choice(data.index, n_cluster)\n", " centroids = [(data.loc[idx, \"sepal_length\"], data.loc[idx, \"sepal_width\"]) for idx in centroids_idx]\n", " return centroids" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T14:18:57.342515", "start_time": "2016-07-03T14:18:57.330858" }, "collapsed": true }, "outputs": [], "source": [ "def clusters(data, centroids):\n", " d_centroids = []\n", " for length, width in centroids:\n", " d_centroids.append(np.linalg.norm(\n", " np.c_[data.sepal_length - length, data.sepal_width - width], axis=1))\n", "\n", " d_centroids = np.array(d_centroids).T\n", " clusters = np.argmin(d_centroids, axis=1)\n", " return clusters\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T14:20:21.529068", "start_time": "2016-07-03T14:20:21.521946" }, "collapsed": true }, "outputs": [], "source": [ "def move_centroids(data, n_cluster, clusters):\n", " new_centroids = []\n", " for c in range(n_cluster):\n", " c_data = data[clusters == c]\n", " center = c_data.sepal_length.mean(), c_data.sepal_width.mean()\n", " new_centroids.append(center)\n", " return new_centroids\n" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T20:43:31.598189", "start_time": "2016-07-03T20:43:30.930219" }, "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 Counter({2: 85, 0: 47, 1: 18}) [(4.5999999999999996, 3.2000000000000002), (7.7000000000000002, 3.7999999999999998), (5.7999999999999998, 2.7000000000000002)]\n", "1 Counter({2: 67, 0: 56, 1: 27}) [(4.9425531914893615, 3.3659574468085105), (7.283333333333336, 3.1333333333333337), (6.036470588235295, 2.870588235294118)]\n", "2 Counter({2: 63, 0: 56, 1: 31}) [(5.014285714285713, 3.3357142857142863), (7.096296296296296, 3.1148148148148134), (6.031343283582089, 2.8014925373134334)]\n", "3 Counter({2: 60, 0: 56, 1: 34}) [(5.014285714285713, 3.3357142857142863), (7.032258064516128, 3.0870967741935478), (5.995238095238095, 2.795238095238096)]\n", "4 Counter({2: 58, 0: 56, 1: 36}) [(5.014285714285713, 3.3357142857142863), (6.985294117647057, 3.079411764705882), (5.97, 2.785000000000001)]\n", "5 Counter({0: 56, 2: 56, 1: 38}) [(5.014285714285713, 3.3357142857142863), (6.952777777777776, 3.0861111111111104), (5.955172413793104, 2.770689655172414)]\n", "6 Counter({0: 56, 2: 55, 1: 39}) [(5.014285714285713, 3.3357142857142863), (6.926315789473683, 3.0789473684210518), (5.9375, 2.7642857142857147)]\n", "7 Counter({0: 55, 2: 54, 1: 41}) [(5.014285714285713, 3.3357142857142863), (6.910256410256409, 3.0871794871794864), (5.930909090909091, 2.752727272727273)]\n", "8 Counter({0: 54, 2: 54, 1: 42}) [(5.014545454545454, 3.354545454545455), (6.8804878048780465, 3.0975609756097553), (5.9, 2.724074074074074)]\n", "9 Counter({2: 54, 0: 53, 1: 43}) [(5.012962962962962, 3.3703703703703707), (6.869047619047618, 3.0928571428571425), (5.875925925925925, 2.7166666666666663)]\n", "10 Counter({2: 53, 0: 52, 1: 45}) [(5.00943396226415, 3.383018867924529), (6.853488372093022, 3.0999999999999996), (5.857407407407408, 2.7037037037037037)]\n", "11 Counter({2: 54, 0: 51, 1: 45}) [(5.0019230769230765, 3.390384615384616), (6.83333333333333, 3.086666666666666), (5.828301886792453, 2.70566037735849)]\n", "12 Counter({2: 53, 0: 51, 1: 46}) [(5.003921568627451, 3.409803921568628), (6.83333333333333, 3.086666666666666), (5.811111111111113, 2.6999999999999997)]\n", "13 Counter({2: 53, 0: 51, 1: 46}) [(5.003921568627451, 3.409803921568628), (6.823913043478258, 3.0782608695652165), (5.800000000000001, 2.6999999999999997)]\n", "old_centroids == centroids\n", "[(5.003921568627451, 3.409803921568628), (6.823913043478258, 3.0782608695652165), (5.800000000000001, 2.6999999999999997)]\n", "[(5.003921568627451, 3.409803921568628), (6.823913043478258, 3.0782608695652165), (5.800000000000001, 2.6999999999999997)]\n" ] }, { "data": { "image/png": "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\nFuVyLhWhSbvI/dNQZnYQcDtwtbvfMmL4S+6+Mfy+FcDhQGSy6O6enkucrco7jv4tO9ijVh22Pdo5\nR762qb+XWm3K0Ha1vze3WJvPVatNGXauseLIO74sjrV23VoqTXdxu9atbfm4Sb9/Q0//sOuxYbA/\ns+sxWf6tJFWWONpV3hPcBwB3Ax919/tGjO0NPG5mhwLbgOOB6+KOWZJlhnOPY2bXVHYODA7bHnnO\n0eIYnDlr6F1+YzuvWBvnCu4sdg0711hx5BlfVn8uU+a8ivratcO2WzluK3HMqM5kYMCHbWfxM5Ro\nSW7FMSKOdpX3ncViYF/gYjO7BKgD1wJd7r7EzBYD9wMvAfe4+105x9M2jn5jULnaPGeRxEQ0OBqt\nKG+sONqhUG7WwnMBhs1Z5EVFaNIu1PwohTK9S1EciqOsMSiOUeNQ8yMREelcShYiIhJLyUJERGJp\nIcGSaqfitbXr1jJlzqtyLV4TkYmlf9kl1U7Fa5VKZeijpnkVr4nIxCrXW1UZ0g5d3ravWRO5LSKd\nQ8mipNqhy9u0gw+O3BaRzqHHUCXVTsVru5rmLESkMylZlFQ7dHmr1moc+IFFpSl4EpH86DGUiIjE\nUrIQEZFYegzVgkZDov4tO5jZNTVxQ6KsRTUdmoxxZK0dalxEiqZk0YJGQ6I9atWh5cOTNCTKWlTT\nockYR9baocZFpGh6u9SCnr4tkdtFKUsNRlniyFqn/lwi46Fk0YK53V2R20UpSw1GWeLIWqf+XCLj\nocdQLWg0IGqes5gIUU2HJmMcWWuHGheRoilZtKBaqfC2w+ZMeF1BowZDceSjHWpcRIqmx1AiIhJL\nyUJERGIpWYiISCzNWUjbS9OESYV3Iq1RspC2l6YJkwrvRFqjt1LS9tI0YVLhnUhrlCyk7aVpwqTC\nO5HW6DGUtL00TZhUeCfSGiULaXtpmjCp8E6kNXoMJSIisZQsREQklpKFiIjEUrIQEZFYShYiIhJL\nyUJERGIpWYiISCwlCxERiaVkISIisZQsREQkVq7LfZhZDfga8BpgKvA5d1/eNH4ycDGwE7je3Zfk\nGY+IiKST953F2cBz7r4AeBdwdWMgTCRfBE4A3g582My6c46nI9QHB3nxoQf4ryXX8+JDD1AfHJzo\nkESkw+W9kOCtwDfDr6sEdxAN84Cn3H0jgJk9BCwAbss5prbXaNxTq01hYOBxQI17RCRfuSYLd98K\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import ipywidgets\n", "\n", "@ipywidgets.interact(\n", " n_cluster=(2, 6, 1),\n", " max_iter=(1, 100, 1),\n", " verbose=False\n", ")\n", "def run_my_kmeans(n_cluster=3, max_iter=30, verbose=False):\n", " iris_my_kmeans = iris.copy()\n", " iris_my_kmeans[\"species\"] = kmeans(iris_my_kmeans,\n", " n_cluster=n_cluster,\n", " max_iter=max_iter,\n", " random_state=0,\n", " verbose=verbose)\n", " sns.lmplot(data=iris_my_kmeans, x=\"sepal_length\", y=\"sepal_width\", hue=\"species\", fit_reg=False)\n" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "ExecuteTime": { "end_time": "2016-07-03T20:17:51.062685", "start_time": "2016-07-03T20:17:51.042077" }, "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(148, 150)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels = pd.DataFrame({\n", " \"sk\": iris_kmeans.species,\n", " \"my\": iris_my_kmeans.species\n", " })\n", "labels[\"same\"] = labels.sk == labels.my\n", "labels.same.sum(), labels.shape[0]" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python [default]", "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.5.2" }, "toc": { "toc_cell": false, "toc_number_sections": true, "toc_threshold": 6, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 0 }