{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " x y\n", "0 -15.782689 -0.254265\n", "1 -3.977557 4.819669\n", "2 -18.330663 -28.667342\n", "3 -40.254848 -17.583849\n", "4 -35.352412 -16.411859\n", "5 -0.785538 14.015280\n", "6 2.393177 38.056014\n", "7 -8.767911 13.764614\n", "8 -25.912887 -2.752717\n", "9 -18.022458 12.628714\n", "10 2.706564 34.568426\n", "11 -25.282147 -7.125060\n", "12 2.786527 19.962042\n", "13 18.079987 -9.952786\n", "14 33.559819 -4.432935\n", "15 28.712898 -24.022064\n", "16 26.195718 -13.391081\n", "17 42.174709 -13.849395\n", "18 35.859710 0.628594\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import pandas as pd #penggunaan library pandas untuk....\n", "\n", "import numpy as np\n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "df = pd.DataFrame({\n", " 'x': [12, 20, 28, 18, 29, 33, 24, 45, 45, 52, 51, 52, 55, 53, 55, 61, 64, 69, 72],\n", " 'y': [39, 36, 30, 52, 54, 46, 55, 59, 63, 70, 66, 63, 58, 23, 14, 8, 19, 7, 24],\n", " 'z': [40, 50, 12, 7, 8, 55, 78, 45, 20, 35, 67, 15, 55, 45, 60, 40, 45, 55, 60]\n", "})\n", "\n", "\n", "from sklearn.decomposition import PCA\n", "pca = PCA(n_components=2)\n", "principalComponents = pca.fit_transform(df)\n", "principalDf = pd.DataFrame(data = principalComponents\n", " , columns = ['x', 'y'])\n", "\n", "print(principalDf)\n", "\n", "\n", "np.random.seed(200)\n", "k = 3\n", "# centroids[i] = [x, y]\n", "centroids = {\n", " i+1: [np.random.randint(-50,50), np.random.randint(-50, 50)]\n", " for i in range(k)\n", "}\n", " \n", "fig = plt.figure(figsize=(10, 10))\n", "plt.scatter(principalDf['x'], principalDf['y'], color='k')\n", "colmap = {1: 'r', 2: 'g', 3: 'b'}\n", "for i in centroids.keys():\n", " plt.scatter(*centroids[i], color=colmap[i])\n", "plt.xlim(-50, 50)\n", "plt.ylim(-50, 50)\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " x y distance_from_1 distance_from_2 distance_from_3 \\\n", "0 -15.782689 -0.254265 34.731813 34.659291 33.484423 \n", "1 -3.977557 4.819669 43.679113 25.443210 23.004411 \n", "2 -18.330663 -28.667342 7.783227 41.797800 59.437683 \n", "3 -40.254848 -17.583849 23.102166 59.037932 62.829557 \n", "4 -35.352412 -16.411859 20.933704 54.011473 58.541293 \n", "5 -0.785538 14.015280 53.332714 28.940785 13.308117 \n", "6 2.393177 38.056014 76.737663 48.628483 12.334626 \n", "7 -8.767911 13.764614 50.134568 34.499557 18.419013 \n", "8 -25.912887 -2.752717 31.305780 44.225283 42.217595 \n", "9 -18.022458 12.628714 47.010297 41.510978 26.623764 \n", "10 2.706564 34.568426 73.585797 45.232290 8.870049 \n", "11 -25.282147 -7.125060 26.905507 43.290989 44.880709 \n", "12 2.786527 19.962042 60.244668 31.832775 6.430894 \n", "13 18.079987 -9.952786 48.466419 1.954423 38.258187 \n", "14 33.559819 -4.432935 64.709691 15.963456 41.735199 \n", "15 28.712898 -24.022064 53.648940 19.273628 55.358002 \n", "16 26.195718 -13.391081 54.261751 9.809870 44.731597 \n", "17 42.174709 -13.849395 69.174699 24.872314 54.497094 \n", "18 35.859710 0.628594 69.154352 19.834865 39.950344 \n", "\n", " closest color \n", "0 3 b \n", "1 3 b \n", "2 1 r \n", "3 1 r \n", "4 1 r \n", "5 3 b \n", "6 3 b \n", "7 3 b \n", "8 1 r \n", "9 3 b \n", "10 3 b \n", "11 1 r \n", "12 3 b \n", "13 2 g \n", "14 2 g \n", "15 2 g \n", "16 2 g \n", "17 2 g \n", "18 2 g \n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "## Assignment Stage\n", "\n", "def assignment(df, centroids):\n", " for i in centroids.keys():\n", " # sqrt((x1 - x2)^2 - (y1 - y2)^2)\n", " df['distance_from_{}'.format(i)] = (\n", " np.sqrt(\n", " (df['x'] - centroids[i][0]) ** 2\n", " + (df['y'] - centroids[i][1]) ** 2\n", " )\n", " )\n", " centroid_distance_cols = ['distance_from_{}'.format(i) for i in centroids.keys()]\n", " df['closest'] = df.loc[:, centroid_distance_cols].idxmin(axis=1)\n", " df['closest'] = df['closest'].map(lambda x: int(x.lstrip('distance_from_')))\n", " df['color'] = df['closest'].map(lambda x: colmap[x])\n", " return df\n", "\n", "df = assignment(principalDf, centroids)\n", "print(df)\n", "\n", "fig = plt.figure(figsize=(10, 10))\n", "plt.scatter(df['x'], df['y'], color=df['color'], alpha=0.5, edgecolor='k')\n", "for i in centroids.keys():\n", " plt.scatter(*centroids[i], color=colmap[i])\n", "plt.xlim(-50, 50)\n", "plt.ylim(-50, 50)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "## Update Stage\n", "\n", "import copy\n", "\n", "old_centroids = copy.deepcopy(centroids)\n", "\n", "def update(k):\n", " for i in centroids.keys():\n", " centroids[i][0] = np.mean(df[df['closest'] == i]['x'])\n", " centroids[i][1] = np.mean(df[df['closest'] == i]['y'])\n", " return k\n", "\n", "centroids = update(centroids)\n", " \n", "fig = plt.figure(figsize=(10, 10))\n", "ax = plt.axes()\n", "plt.scatter(principalDf['x'], principalDf['y'], color=df['color'], alpha=0.5, edgecolor='k')\n", "for i in centroids.keys():\n", " plt.scatter(*centroids[i], color=colmap[i])\n", "plt.xlim(-50, 50)\n", "plt.ylim(-50, 50)\n", "for i in old_centroids.keys():\n", " old_x = old_centroids[i][0]\n", " old_y = old_centroids[i][1]\n", " dx = (centroids[i][0] - old_centroids[i][0]) * 0.25\n", " dy = (centroids[i][1] - old_centroids[i][1]) * 0.25\n", " ax.arrow(old_x, old_y, dx, dy, head_width=2, head_length=3, fc=colmap[i], ec=colmap[i])\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAAJCCAYAAAD3HAIiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XuQn3V99//XZ3eTzYlwyIFDks1GBOQMug0HtSpCFQWx1lPL7bEWOz/a2qn31Coz98xv/HFPe3dGaUftlLsHbeVWqXoXRbHKoaItHpazGEFAEiAQQiAhgZw2+fz+yEoTDUTIfnLtJo/HDJP9fr7X7vWeuUjyzHVd3++31FoDAEAbPV0PAACwNxNbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGurreoDtzZ49uw4ODnY9BgDALt14442P1lrn7Gq7cRVbg4ODGR4e7noMAIBdKqUs/VW2cxkRAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKChMYutUkpvKeXmUsqVo48XlVK+X0r5aSnlC6WUyWO1LwCAiWIsz2x9IMmS7R7/RZKP11qPSPJ4kt8dw30BAEwIYxJbpZT5SV6f5O9GH5ckZyT54ugmn0nyxrHYFwDARDJWZ7YuSfKnSbaOPp6VZHWtdWT08QNJ5o3RvgAAJozdjq1SyjlJHqm13rj98k42rc/w/ReUUoZLKcMrV67c3XEAAMaVsTiz9dIkbyil3Jfk89l2+fCSJAeUUvpGt5mfZPnOvrnWemmtdajWOjRnzpwxGAcAYPzY7diqtX641jq/1jqY5O1Jrq21np/kuiRvHt3sXUmu2N19AQBMNC3fZ+tDSf6klHJ3tt3D9fcN9wUAMC717XqTX12t9d+T/Pvo1/cmWTyWPx8AYKLxDvIAAA2N6ZktgL3BihUrsmLFihx00EGZN29etr11IMDzI7YARo2MjOTTn/5ivvvd5entXZitW5fnxBNn5P3vf3umTp3a9XjABOUyIsCoa6+9Pt/+djIw8IEsWPBbGRj4g9x885xcccU3ux4NmMDEFsCoq6++LYccckZ6enqTJKWUzJ9/Rq699kfZunXrLr4bYOfEFsCoDRs2pa9vyg5rvb2Ts3nzVrEFPG9iC2DUqacekRUrhndYe/jhW3LyyQvT1+cWV+D58acHwKjXv/6M/OhH/5j77nsskycvyubNy3PAAXfmbW97R9ejARNYqXWnnw/diaGhoTo8PLzrDQEa2bBhQ2666ZYsXboihx56UIaGTs6MGTO6HgsYh0opN9Zah3a1nTNbANuZMmVKTj/91Jx+eteTAHsL92wBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGvJxPQA7sWXLltx9991Zt25dFixYkLlz53Y9EjBBiS2AX7Bq1ap8/OOfzYMPzkwpB6XWf89rXvPCvPWt56anxwUB4LkRWwC/4O///stZufL0LFz4a0mSLVs252tf+6ccccQteclLXtzxdMBE459oANt57LHHsmTJEznkkJc8vdbbOyn77/+yXH/97R1OBkxUYgtgO1u2bEkpfUnKDuu9vZOyceNIN0MBE5rYAtjO7Nmzc+ihJY89dvfTa7XWPPbYD3PaaUd1OBkwUblnC2A7pZT83u+9IX/5l5dn6dJj0tMzKyMjS/LiFyennba46/GACajUWrue4WlDQ0N1eHi46zEAsnbt2tx00y1ZvXpdXvjCgbzoRS9Kb29v12MB40gp5cZa69CutnNmC2An9ttvv7ziFS/vegxgL+CeLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AJ5FrbXrEYAJrm93f0ApZUGSf0pySJKtSS6ttf5VKeWgJF9IMpjkviRvrbU+vrv7A9gTHnjggfzLv1yd229fmpkzp+Xss1+SM898RXp7e7seDZhgxuLM1kiSD9Zaj05yapILSynHJPmzJNfUWo9Ics3oY4Bx79FHH83FF/+f3HnnyZk//6JMnvzefPazD+WLX/xa16MBE9Bux1at9aFa602jX69NsiTJvCTnJfnM6GafSfLG3d0XwJ5w/fXfz6ZNi3PIISemp6cv06bNysKFb843v7kka9eu7Xo8YIIZ03u2SimDSU5O8v0kB9daH0q2BVmSuc/wPReUUoZLKcMrV64cy3EAnpf77ns006cv2GGtr68/yew8/ri7IYDnZsxiq5QyI8mXkvxxrfWJX/X7aq2X1lqHaq1Dc+bMGatxAJ63RYvmZN26ZTusjYxsSCkrc9BBB3U0FTBRjUlslVImZVtoXVZr/fLo8opSyqGjzx+a5JGx2BdAa7/+66dk2rThLF9+Y0ZGNubJJx/J0qWX5+yzj8+MGTO6Hg+YYHY7tkopJcnfJ1lSa/3Ydk99Jcm7Rr9+V5IrdndfAHvCrFmzctFF/y0nnbQkK1b8ZWr9bN797oX5zd88u+vRgAmo7O57yJRSXpbkO0luz7a3fkiSj2TbfVuXJxlIsizJW2qtjz3bzxoaGqrDw8O7NQ8AwJ5QSrmx1jq0q+12+322aq3fTVKe4elX7+7PBwCYyLyDPABAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS1gj7rssmRwMOnp2fbrZZd1PRFAW7v9pqYAv6rLLksuuCB56qltj5cu3fY4Sc4/v7u5AFpyZgvYYy666L9C6+eeemrbOsDeSmwBe8yyZc9tHWBvILaAPWZg4LmtA+wNxBawx1x8cTJt2o5r06ZtWwfYW4ktYI85//zk0kuThQuTUrb9eumlbo4H9m5ejQjsUeefL66AfYszWwAADYktAICGxBYAQENiCwCgIbEFANCQ2AIAaEhsAQA0JLYAABrypqbAXmFkZCS33npbbrnlnsyY0Z/TTz85CxYs6HosALEF7FytNQ8++GDWrVuX+fPnZ8aMGV2P9IxGRkbyiU/8c268sTczZpyUTZvW5Rvf+JdccMHLctppi7seD9jHiS3gl6xZsyaf/OTn8tOfbkkpB6Sn51/ztredmjPPfEVKKV2P90tuu+223HRTb17wgnc8Pd/69Ufn05/+25x88gmZMmVKxxMC+zKxBfySv/u7L+bee4/LwMBLU0rJpk1P5rOf/XTmzz84Rx99dNfj/ZKbb74n06aduEMITp16YFauPCzLli3LkUce2eF0wL7ODfLADlatWpUf/Wh15s07/el4mTx5eqZNe3m+/e1bOp5u52bOnJKRkSd3WKu1ptYnndUCOie2gB1s3LgxpUxNKTv+8TBp0vSsW7exo6me3amnnpQtW76X9esfT7IttB5++OYMDIy4SR7onMuIwA4OPvjgHHDAU1m7dnn22++wJNviZfXqm/OmNx3e8XQ7t2DBgrz//S/Ppz/9t1m58rAkT2ZgYEsuvPDt4/IeM2DfIrZgDG3ZsiVr1qzJ9OnT09/f3/U4z0tvb2/e+96zc8kll+Xxxxenv//APPnkHXnRi9bktNPO7Xq8Z3Tqqb+Wk046Pvfff3/6+/uzYMECoQWMC6XW2vUMTxsaGqrDw8NdjwHPy/e/P5zPfe7f88QTfenr25DXvOb4nHfea9LXNzH/TbNixYrccMNNWbVqXY4/fjAnnXRiJk+e3PVYAONGKeXGWuvQrrabmH8LwDjzk5/8JJ/61H9m7tx3ZmBgbjZvfipXXPGVlPLNvOlNr+t6vOfl4IMPzhvfeHbXYwBMeG6QhzHwjW98PzNmnJnp0+cmSSZNmpb588/Nv/3bbdm0aVPH0wHQJbEFY2DFiicybdqcHdYmT56ezZsnZ/369R1NBcB4ILZgDBx77Lw8/vhdO6ytXftQDjoo2W+//TqaCoDxQGzBGHjNa16eqVP/M/ff/92sW7ciK1bcnlWrvpDf+Z0z0tPjtxnAvswN8jAG5syZk//xP96dq6/+j9xxx60ZHNw/r3nN63PEEUd0PRoAHRNbMEbmzJmT3/7tN3Y9BgDjjOsbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIb6uh4A2LfVWrNkyZL84Ac/TpIsXnxMjj766JRSOp4MYGyILaBT//IvX82VVy7P1KmnJEmuvfY7ed3rfpq3ve0NggvYK4gtoDMPPvhgrrrq3ixc+P+kt3dykmTLluNy1VWfzMtfvjzz5s3reEKA3eeeLaAz9957b7ZuPfrp0EqS3t5JSY7NPffc091gAGNIbAGdmTJlSkpZ90vrpazNlClTOpgIYOyJLaAzxx57bGbMuCePP/6zp9dWr74v06b9NMcdd1yHkwGMHfdsAZ2ZNm1a/uRP3pxPfvLLWbZsZpKSAw9cnQ9+8M2ZNm1a1+MBjIlSa+16hqcNDQ3V4eHhrscA9rAtW7Zk2bJlSZKBgYH09vZ2PBHArpVSbqy1Du1qO2e2gM719vZm0aJFXY8B0IR7tgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0FBf1wMAAHtWrTU33XRTvv7tr+ex1Y/l+COPzzm/cU7mzp3b9Wh7JWe2AGAfc8111+SSL12SRw99NP2L+/OfT/xnPvrXH82qVau6Hm2vJLYAYB+ycePGfOlbX8r8l87PgYcemCkzpmT+MfPz1Jynct3113U93l6peWyVUl5bSrmzlHJ3KeXPWu8PAHhmjz32WDb1bUr/9P4d1mceOjN3Lburo6n2bk1jq5TSm+STSc5OckyS3y6lHNNynzDRbNiwIevWrUuttetRgH3A/vvvn7KxZGTTyA7r61aty/y58zuaau/W+gb5xUnurrXemySllM8nOS/JjxvvF8a9devW5crPfz4/u+GG9GzdmgOOOCKve8c7smDBgq5HA/Zi06ZNy1mnnJUrb7gy84fmZ/K0yXl8+eOpS2vOOPeMrsfbK7WOrXlJ7t/u8QNJTmm8Txj3aq353Kc+lcElS/Km+fMzqacnP37ggXz+L/4i7/+f/zMzZ87sekRgL/Zb5/1WpvRPyTe+841sGNmQgbkD+YP3/kHmz3dmq4XWsVV2srbDtZJSygVJLkiSgYGBxuPA+HD//fdn049/nDMXLkwp236bHDt3bpYtXZqbfvjDvPLVr+54QmBv1tfXl/POOS/nnH1ONm3alClTpjz9ZxFjr/UN8g8k2f6ayPwky7ffoNZ6aa11qNY6NGfOnMbjwPiwevXqHNzT80t/uB08eXJWP/xwR1MB+5re3t5MnTpVaDXWOrZ+mOSIUsqiUsrkJG9P8pXG+4Rx77DDDst9tWbzli07rP90w4bMO+KIjqYCoIWmsVVrHUnyB0n+LcmSJJfXWu9ouU+YCGbPnp3Dzzor/+e++7J09eqsWLcuX//Zz7Jy0aKccOKJXY8HwBgq4+nl5kNDQ3V4eLjrMWCP2Lp1a75/ww259Zprsmn9+hx52ml5+atfnenTp3c9GgC/glLKjbXWoV1t57MRoSM9PT057aUvzWkvfWnXowDQkI/rAQBoSGwBADQktgAAGhJbAAANiS0AgIa8GpFxa8uWLbnzzjvz0IMP5oCDDspxxx2X/v7+rscCgOdEbDEubdiwIf/013+dvjvuyAt7enJPrfn3OXPyzj/90/hYJwAmEpcRGZe+c+21mfujH+U9g4P59YUL89bBwfz6mjX52mWXdT0aADwnYotxacl3vpPT5s7d4cNRX3zIIXnottuyfv36DicDgOdGbDEu9fT0ZMsvfJRUHf3Pp9MDMJGILcalY1/5ynz3kUeydbvg+t7y5RkYGsqUKVM6nAwAnhs3yDMuveyVr8zn7rwzfzM8nMNLycNJnpg/P+/8nd/pejQAeE7EFuPSpEmT8o4LL8zSpUvz0EMPZWD//XPUUUelt7e369EA4DkRW4xbpZQMDg5mcHCw61EA4HkTWwAwwdVas2zZsqxatSpz587NvHnzvJhoHBFbADCBrV+/Pp/6h0/l9gdvT+/+vdmyeksWH74473vn+zJ58uSuxyNiCwAmtCu+dkVuf/L2LDxrYUopqVtrbvjPGzJwzUDOOfucrscj3voBACasWmuu+8F1mXfCf102LD0lhx5/aK793rUdT8fPiS0AmKBqrRkZGUlP345/nfdO6s2mzZs6mopfJLYAYILq6enJ0HFDefiuh3dYX3HXipx20mkdTcUvcs8WAExgb3nDW3LvJ+/NfTfcl0kHTMrmVZszr2dezn3tuV2PxqhSf+Hz57o0NDRUh4eHux4DACaU9evX5+Zbbs7Djzyc+YfOz4knnpj+/v6ux9rrlVJurLUO7Wo7Z7YAYIKbOnVqTj/t9K7H4Bm4ZwsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA156wcmhFprfvzjH+fW66/P5vXrc8TixRlavNgn2gMw7oktJoRvfe1ruefyy/Oy6dMzpa8vN95yS5b84Ad51x/9Ufr6/G8MwPjlMiLj3urVq3PLl7+c9wwM5PiDD84Rs2blbYsWpe/WW3PHHXd0PR4APCuxxbi3bNmyLEoyZbszWKWUHDN5cpb+5CfdDQYAvwKxxbg3ffr0rN7JZ3iu3rIl0w84oIOJAOBXJ7YY9xYtWpQNAwP54UMP5ecfnL5szZrc3NeXk4Z2+fmfANApdxYz7vX09OR3/uiP8qX//b/z3TvvTH8pWX/ggTnvgx/MrFmzuh4PAJ6V2GJCmDVrVn7vQx/Ko48+ms2bN+fggw9Ob29v12MBwC6JLSaMUkrmzJnT9RgA8Jy4ZwsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA156wcA9piNGzfm7rvvzsjISA4//PDMmDGj65GgObEFwB5xzz335K/+8a+yrn9dak9N35q+vO/N78spi0/pejRoSmwB0NzGjRtzyT9ckr4T+jJw8ECSZP3a9fnbL/5tFg0uyty5czueENpxzxYAzd111115cuqT2f/g/Z9em7rf1NRDa2659ZYOJ4P2xBYAzY2MjKT21l9aL70lmzZv6mAi2HPEFgDNvfCFL0zv6t5sfHLj02tbNm/Jloe25Nijj+1wMmhPbAHQ3H777Zd3n/fuPHz9w1l6y9Lcf/v9WXbtsrx+6PUZHBzserxx4bLbL8vgJYPp+X97MnjJYC67/bKuR2KMuEEegD3iZae/LIcvOjw33XJTRraM5PjXH59FixallNL1aJ277PbLcsFXL8hTm59KkixdszQXfPWCJMn5x5/f5WiMgVLrL19D78rQ0FAdHh7uegwA2KMGLxnM0jVLf2l94f4Lc98f37fnB+JXUkq5sdY6tKvtXEYEgI4tW7PsOa0zsYgtAOjYwP4Dz2mdiUVsAUDHLn71xZk2adoOa9MmTcvFr764o4kYS2ILADp2/vHn59JzL83C/RempGTh/gtz6bmXujl+L+EGeQCA58EN8gAA44DYAgBoSGwBADQktgAAGhJbAAAN+WxEAHgWK1euzHdv+G4eXvVwjho8KqcsPiXTp0/veiwmELEFAM/gnnvuyf/6u/+VkUNHMmX/Kfn+D76fb/7HN/ORP/pIZs6c2fV4TBAuIwLATtRa85kvfib9x/VnwQkLMmfhnAyeMpgVU1fk6uuu7nq8vc769euzfPnyPPXUU12PMuac2QKAnVi7dm3uX3V/Bhbv+PmEs18wOz+844d503lv6miyvUutNV//t6/niuuuyNb+rcmG5OzTz84bz31jent7ux5vTIgtANiJyZMnp7f2ZsvmLemb/F9/XW58amNmTZ/V4WR7l+/+x3fzue9+LgOvHMjkqZOzeePm/OsN/5rp06fntWe9tuvxxoTLiACwE1OmTMnLT355HrjlgdSt2z7abvPGzXl8yeM586Vndjzd3uOq66/KwScdnMlTJydJJvVPymEvPixf//bXM54+UnB3OLMFAM/grb/51qy7bF2Gvzmcnmk9KetK3vKKt+QlL3lJ16PtNR5b81hm7bfjmcIpM6ZkxZMrsnXr1r3iUqLYoo3LLksuuihZtiwZGEguvjg536fXAxPL1KlTc+H7LszKlSuzZs2aHHLIIZkxY0bXY+1VTjjyhNxy3y057KjDnl57dNmjOfoFR+8VoZWILVq47LLkgguSn7+iZOnSbY8TwQVMSHPmzMmcOXO6HmOv9Maz35g7PnFH7t94f2YePDNrH12b3gd687b3v63r0cZMGU/XQ4eGhurw8HDXY7C7Bge3BdYvWrgwue++PT0NAOPco48+muuuvy73PHBPFh66MK96+atyyCGHdD3WLpVSbqy1Du1qO2e2GHvLlj23dQD2abNnz85b3vSWrsdoxqsRGXsDA89tHQD2YmKLsXfxxcm0aTuuTZu2bR0A9jFii7F3/vnJpZduu0erlG2/Xnqpm+MB2Ce5Z4s2zj9fXAFAnNkCAGjKma29yMjISB544IH09vZm3rx56enR0gDQNbG1l7jzzjvzlb/5mxz4xBMZSbLhkEPylgsvzLx587oeDQD2aU597AXWrFmTKz7+8fx2T0/eNzCQ3x8YyGufeCKf+9jHsnnz5q7HA4B9mtjaC9x2yy05bsOGzJ858+m1F82enUMfeyx33nlnh5MBAGJrL7D+ySezXym/tL5fkvXr1+/5gQCAp4mtvcALjjwyP9q6NVu2bn16bcPISO4qJYsWLepwMgDADfJ7gcMPPzzDv/7r+cy3v51fmz49m7duzfc2bMhxb3pTZs+e3fV4ALBPE1sNLVu2LN+58so8dNddOWjevJx2zjk5+uijx3w/pZS89T3vye1DQ/nxD36Q3kmTcsapp+aoo44a830BAM9NqbV2PcPThoaG6vDwcNdjjIlly5blCx/9aM7q7c0LDjwwD61dm6vWrs2r/viPc+LJJ3c9HgCwm0opN9Zah3a1nTNbjVz/1a/mrN7enHTIIUmSmf39mT55cr70hS/khJNOStnJDe0AwN7HDfKNPHTXXTn8wAN3WJs/c2aeWrEiGzdu7GgqAGBPE1uNHHjYYXlo3bod1lY99VT6Zs7M5MmTO5oKANjTxFYjp597bq5asybL165Nkjy2fn3+9aGHcsp55/nMQgDYh7hnq5FjjjkmGz/wgVx++eXZsHRpemfOzCnvfnde/qpXdT0aALAHia2GTn7JS3LSi1+cDRs2pL+/3xktANgHia3GSimZOnVq12MAAB1xqgUAoCGxBQDQkNgCAGhIbAEANLRbsVVK+ctSyk9KKbeVUv5vKeWA7Z77cCnl7lLKnaWU1+z+qAAAE8/untn6VpLjaq0nJLkryYeTpJRyTJK3Jzk2yWuTfKqU0rub+wIAmHB2K7Zqrd+stY6MPvxekvmjX5+X5PO11o211p8luTvJ4t3ZFwDARDSW92y9N8lVo1/PS3L/ds89MLoGALBP2eWbmpZSrk5yyE6euqjWesXoNhclGUly2c+/bSfb12f4+RckuSBJBgYGfoWRAQAmjl3GVq31zGd7vpTyriTnJHl1rfXnQfVAkgXbbTY/yfJn+PmXJrk0SYaGhnYaZAAAE9XuvhrxtUk+lOQNtdantnvqK0neXkrpL6UsSnJEkh/szr4AACai3f1sxE8k6U/yrVJKknyv1vr7tdY7SimXJ/lxtl1evLDWumU39wUAMOHsVmzVWl/4LM9dnOTi3fn5AAATnXeQBwBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIb6uh4AAPZGS5YsyVev/mqWr1yeIxcemXPOOicDAwNdj0UHnNkCgDF208035c8/8+dZtv+yTD1lam7dems++qmPZtmyZV2PRgfEFgCMoVprLr/y8sx6yazMHpid/un9OfSIQ9P7wt5cefWVXY9HB8QWAIyhDRs25JEnHsnMOTN3WD/wsANz1313dTQVXRJbADCG+vv7s9+U/bL+ifU7rK9btS6HzTmso6noktgCgDHU09OTN5zxhiz/4fKng+uJlU/kiTueyLlnntvxdHTBqxEBYIyd8cozkiRXXHNFHtnwSObuPzcfeNsHcvTRR3c8GV0QWwAwxkopefWrXp1XveJV2bhxY6ZMmZJSStdj0RGxBQCN9PT0ZOrUqV2PQcfcswUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgDCttxHAAAIu0lEQVRAQ2ILAKChvq4HgIlu69at+clPfpI7b7opvZMm5fjFi7No0aKuxwJgnBBbsBtqrfnSP/9zHr/mmrxkypRs2ro1X7nqqpx4/vl55VlndT0eAOOA2ILdcM899+TRa6/N7w0Opq9n21X5EzZtyic+97mc9Gu/lgMOOKDjCQHomnu2YDfcvWRJju/tfTq0kmT65Mk5otbce++9HU4GwHghtmA39E+dmqe2bv2l9aeS9Pf37/mBABh3xBbshhNOPjm39PXlkSeffHrt7scey0MHHJAjjzyyw8kAGC/cswW7YdasWXntH/5h/vHSS3PYqlXZlGT1rFl52x/+YSZNmtT1eACMA2ILdtMJJ56Yoz72sdx3333p6+vL4OBgent7ux4LgHFCbMEY6O/vz1FHHdX1GACMQ+7ZAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGhJbAAANiS0AgIbGJLZKKf+9lFJLKbNHH5dSyl+XUu4updxWSnnxWOwHAGCi2e3YKqUsSHJWkmXbLZ+d5IjR/y5I8je7ux8AgIloLM5sfTzJnyap262dl+Sf6jbfS3JAKeXQMdgXAMCEsluxVUp5Q5IHa623/sJT85Lcv93jB0bXdvYzLiilDJdShleuXLk74wAAjDt9u9qglHJ1kkN28tRFST6S5Dd29m07Was7WUut9dIklybJ0NDQTrcBAJiodhlbtdYzd7ZeSjk+yaIkt5ZSkmR+kptKKYuz7UzWgu02n59k+W5PCwAwwTzvy4i11ttrrXNrrYO11sFsC6wX11ofTvKVJO8cfVXiqUnW1FofGpuRAQAmjl2e2Xqevp7kdUnuTvJUkvc02g8AwLg2ZrE1enbr51/XJBeO1c8GAJiovIM8AEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDYgsAoCGxBQDQkNgCAGhIbAEANCS2AAAaElsAAA2JLQCAhsQWAEBDpdba9QxPK6WsTLK06zkamp3k0a6H4Hlz/CYux25ic/wmrr392C2stc7Z1UbjKrb2dqWU4VrrUNdz8Pw4fhOXYzexOX4Tl2O3jcuIAAANiS0AgIbE1p51adcDsFscv4nLsZvYHL+Jy7GLe7YAAJpyZgsAoCGxtQeVUv57KaWWUmaPPi6llL8updxdSrmtlPLirmdkR6WUvyyl/GT0+PzfUsoB2z334dFjd2cp5TVdzskzK6W8dvQY3V1K+bOu5+GZlVIWlFKuK6UsKaXcUUr5wOj6QaWUb5VSfjr664Fdz8ozK6X0llJuLqVcOfp4USnl+6PH7wullMldz7inia09pJSyIMlZSZZtt3x2kiNG/7sgyd90MBrP7ltJjqu1npDkriQfTpJSyjFJ3p7k2CSvTfKpUkpvZ1OyU6PH5JPZ9nvtmCS/PXrsGJ9Gknyw1np0klOTXDh6vP4syTW11iOSXDP6mPHrA0mWbPf4L5J8fPT4PZ7kdzuZqkNia8/5eJI/TbL9TXLnJfmnus33khxQSjm0k+nYqVrrN2utI6MPv5dk/ujX5yX5fK11Y631Z0nuTrK4ixl5VouT3F1rvbfWuinJ57Pt2DEO1VofqrXeNPr12mz7C3teth2zz4xu9pkkb+xmQnallDI/yeuT/N3o45LkjCRfHN1knzx+YmsPKKW8IcmDtdZbf+GpeUnu3+7xA6NrjE/vTXLV6NeO3cTgOE1QpZTBJCcn+X6Sg2utDyXbgizJ3O4mYxcuybYTC1tHH89Ksnq7f7Tuk78H+7oeYG9RSrk6ySE7eeqiJB9J8hs7+7adrHl56B72bMeu1nrF6DYXZdsljst+/m072d6xG38cpwmolDIjyZeS/HGt9YltJ0cY70op5yR5pNZ6YynllT9f3smm+9zvQbE1RmqtZ+5svZRyfJJFSW4d/QNjfpKbSimLs63wF2y3+fwkyxuPyi94pmP3c6WUdyU5J8mr63+9V4pjNzE4ThNMKWVStoXWZbXWL48uryilHFprfWj0VotHupuQZ/HSJG8opbwuyZQkM7PtTNcBpZS+0bNb++TvQZcRG6u13l5rnVtrHay1DmbbH/4vrrU+nOQrSd45+qrEU5Os+fmpcsaHUsprk3woyRtqrU9t99RXkry9lNJfSlmUbS9y+EEXM/KsfpjkiNFXQ03Othc1fKXjmXgGo/f3/H2SJbXWj2331FeSvGv063cluWJPz8au1Vo/XGudP/p33duTXFtrPT/JdUnePLrZPnn8nNnq1teTvC7bbq5+Ksl7uh2HnfhEkv4k3xo9M/m9Wuvv11rvKKVcnuTH2XZ58cJa65YO52Qnaq0jpZQ/SPJvSXqT/EOt9Y6Ox+KZvTTJO5LcXkq5ZXTtI0n+PMnlpZTfzbZXdL+lo/l4fj6U5POllP8vyc3ZFtT7FO8gDwDQkMuIAAANiS0AgIbEFgBAQ2ILAKAhsQUA0JDYAgBoSGwBADQktgAAGvr/AYe3JdhcpO0wAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df = assignment(principalDf, centroids)\n", "\n", "# Plot results\n", "fig = plt.figure(figsize=(10, 10))\n", "plt.scatter(df['x'], df['y'], color=df['color'], alpha=0.5, edgecolor='k')\n", "for i in centroids.keys():\n", " plt.scatter(*centroids[i], color=colmap[i])\n", "plt.xlim(-50, 50)\n", "plt.ylim(-50, 50)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Continue until all assigned categories don't change any more\n", "while True:\n", " closest_centroids = df['closest'].copy(deep=True)\n", " centroids = update(centroids)\n", " df = assignment(df, centroids)\n", " if closest_centroids.equals(df['closest']):\n", " break\n", "\n", "fig = plt.figure(figsize=(10, 10))\n", "plt.scatter(df['x'], df['y'], color=df['color'], alpha=0.5, edgecolor='k')\n", "for i in centroids.keys():\n", " plt.scatter(*centroids[i], color=colmap[i])\n", "plt.xlim(-50, 50)\n", "plt.ylim(-50, 50)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " x y\n", "0 -15.782689 -0.254265\n", "1 -3.977557 4.819669\n", "2 -18.330663 -28.667342\n", "3 -40.254848 -17.583849\n", "4 -35.352412 -16.411859\n", "5 -0.785538 14.015280\n", "6 2.393177 38.056014\n", "7 -8.767911 13.764614\n", "8 -25.912887 -2.752717\n", "9 -18.022458 12.628714\n", "10 2.706564 34.568426\n", "11 -25.282147 -7.125060\n", "12 2.786527 19.962042\n", "13 18.079987 -9.952786\n", "14 33.559819 -4.432935\n", "15 28.712898 -24.022064\n", "16 26.195718 -13.391081\n", "17 42.174709 -13.849395\n", "18 35.859710 0.628594\n" ] }, { "data": { "text/plain": [ "KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,\n", " n_clusters=3, n_init=10, n_jobs=None, precompute_distances='auto',\n", " random_state=None, tol=0.0001, verbose=0)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({\n", " 'x': [12, 20, 28, 18, 29, 33, 24, 45, 45, 52, 51, 52, 55, 53, 55, 61, 64, 69, 72],\n", " 'y': [39, 36, 30, 52, 54, 46, 55, 59, 63, 70, 66, 63, 58, 23, 14, 8, 19, 7, 24],\n", " 'z': [40, 50, 12, 7, 8, 55, 78, 45, 20, 35, 67, 15, 55, 45, 60, 40, 45, 55, 60]\n", "})\n", "\n", "\n", "from sklearn.decomposition import PCA\n", "pca = PCA(n_components=2)\n", "principalComponents = pca.fit_transform(df)\n", "principalDf = pd.DataFrame(data = principalComponents\n", " , columns = ['x', 'y'])\n", "\n", "print(principalDf)\n", "\n", "\n", "from sklearn.cluster import KMeans\n", "\n", "kmeans = KMeans(n_clusters=3)\n", "kmeans.fit(principalDf)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "labels = kmeans.predict(principalDf)\n", "centroids = kmeans.cluster_centers_" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "while True:\n", " closest_centroids = df['closest'].copy(deep=True)\n", " centroids = update(centroids)\n", " df = assignment(df, centroids)\n", " if closest_centroids.equals(df['closest']):\n", " break\n", "\n", "fig = plt.figure(figsize=(10, 10))\n", "plt.scatter(df['x'], df['y'], color=df['color'], alpha=0.5, edgecolor='k')\n", "\n", "\n", "#colors = map(lambda x: colmap[x+1], labels)\n", "for i in centroids.keys():\n", " plt.scatter(*centroids[i], color=colmap[i])\n", "plt.xlim(-50, 50)\n", "plt.ylim(-50, 50)\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "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.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }