Skip to content

Instantly share code, notes, and snippets.

@zhuang-hao-ming
Last active February 13, 2022 04:23
Show Gist options
  • Save zhuang-hao-ming/ca8ac0c1d622e18897bbb4876948dd60 to your computer and use it in GitHub Desktop.
Save zhuang-hao-ming/ca8ac0c1d622e18897bbb4876948dd60 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.datasets import make_blobs\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import numpy as np\n",
"import random"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"centers = [(0, 4), (5, 5), (8, 2)]\n",
"cluster_std = [1.2, 1, 1.1]\n",
"X, Y = make_blobs(n_samples=200, cluster_std=cluster_std, centers=centers, n_features=2, random_state=1)\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'scatter data')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEICAYAAABGaK+TAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAhnUlEQVR4nO3de7CdVZnn8e+Tw4nh2qik0QAhiHToNN66DpoMlyGiDSojM9XSiiNaUErNMD0iBSIy03Q300212F6g2u4qGgERjW28YTfYEOEEIpUwHC4tdCAkiLlACBFBLkNMOHnmj7132GdnX9733eu9rPf8PlWnOPv27udE69lrP+tZa5m7IyIi8ZlRdgAiIpKNEriISKSUwEVEIqUELiISKSVwEZFIKYGLiERKCVwkATP7CzO7oew4RNopgUtUuiVSM1tuZp8sK6ZOZnadmf1V2XFI/SmBy7RnZiNlxyCShRK45MrMPmdmT5jZC2a2xsxObN4/YmYXm9ljzcfuNbNDmo9dYWYbzez55v3HNe8/GbgY+LCZvWhm/2Zmfw0cB/xd876/az73SDNbZma/br7vn7TFdJ2Z/YOZ3WxmLwGLu8R9mJnd0YxtGXBAx+NLzewpM/uNmd1pZn/QvP9s4L8CFzbj+efm/Re1/a2rzey/hP63lmnI3fWjn1x+gPnARmBO8/Y84PDm758FHmw+x4C3Aa9vPvYx4PXAHsD5wFPArOZjfwHc0PE+y4FPtt3eu/m+Zzav8YfAr4A/aD5+HfAb4Bgag5hZXWJfCXwZeA1wPPBC+/sCZwH7Nh//KvBA22PXAX/Vcb3TgDnN9/sw8BLwxrL/N9JP3D8agUueJmkkuAVmNuruv3T3x5qPfRL43+6+xhv+zd2fAXD3G9z9GXd/xd2/1LzG/BTvewrwS3e/tnmN+4DvAx9qe86N7n6Xu+90923tLzazucDRwJ+5+2/d/U7gn9uf4+7XuPsL7v5bGh8qbzOz3+kVkLsvdfcnm+/3T8Ba4J0p/iaR3SiBS27cfR3wGRoJ7mkz+46ZzWk+fAjwWLfXmdn5ZvZwszzxHPA7dJQwBjgUeJeZPdf6oVHWeEPbczb2ef0c4Fl3f6ntvvVt8Y2Y2d80SyLPA79sPtQzRjP7uJk90BbPUSn/JpHdKIFLrtz92+5+LI2k6sAXmg9tBA7vfH6z3v054E+A17r7/jTKHda6ZLe36bi9EbjD3fdv+9nH3f97n9e02wy81sz2brtvbtvvHwVOBd5D48NlXiv8btc2s0OBfwT+lEaZaH/gobbni2SiBC65MbP5ZvZuM3sNsA14mUZZBeBq4P+Y2RHW8FYzez2NuvIrwFZgDzO7BNiv7bJbgHlmNqPjvje13f4X4PfM7AwzG23+HG1mv58kbndfD0wAf2lmM83sWOA/tT1lX+C3wDPAXsBlHZfojGdvGkl9a/Pf5UwaI3CRoSiBS55eA/wNjQnEp4DfpdFFAo0Jwu8CtwLPA18H9gRuAX4CPEqjbLGNqeWOpc3/PmNm9zV/vwL4kJk9a2ZXuvsLwB8BHwGebL73F5rxJPVR4F3Ar4E/B65ve+z6ZmxPAKuBVR2v/TqNuv9zZvYjd18NfInGxOgW4C3AXSliEenK3HWgg4hIjDQCFxGJlBK4iEiklMBFRCKlBC4iEqk98rjoAQcc4PPmzcvj0iIitXTvvff+yt1np3lNLgl83rx5TExM5HFpEZFaMrP1g581lUooIiKRUgIXEYmUEriISKSUwEVEIqUELiISKSVwEZFIKYFLHB65GW66oPFfEQGUwCUGj9wM3z8L7vnHxn+VxEUAJXCJwWO3w46XG7/veLlxW0SUwCUCh78bRvds/D66Z+O2iOSzlF4kqCPfD398TWPkffi7G7dFRAlcInHk+5W4RTqohCJSJHXTSEBK4CJFUTeNBKYELlIUddNIYErgIkVRN40EpklMkaKom0YCUwIXKZK6aSQglVCku6p2S6SNq6p/h0gASuCyu6p2S6SNq6p/h0ggSuCyu6p2S6SNq6p/h0ggSuCyu6p2S6SNq6p/h0gg5u7BLzo2NuYTExPBrysFeuTmanZLpI2r6L+jqv9uUnlmdq+7j6V6jRK4SCCtmvuOlxsj/j++RklcEsuSwFVCEQlFNXcpmBK4SCiquUvBtJBHJBSttJSCKYGLhKSVllIgJfCCLFu9hRVrt3LcEbN574IDyw5HRGpANfACLFu9hU8vuZ/rV67n00vuZ9nqLWWHJCI1oARegBVrt/LyjkkAXt4xyYq1W0uOSETqQAm8AMcdMZs9R0cA2HN0hOOOmF1yRCJSB6qBF+C9Cw7kytPfUXgNXHV3kXpTAi/IexccWGgSbdXdX94xydKJTVx5+juUxPOgpfNSIpVQakp19wJou1opmRJ4TanuHki/AyG0dF5KphJKTZVVd6+V9s2pHrhh982pDn934/7W5lVaOi8FUwKvsaLr7rXTbYTdnsCrsHReNfhpTQlcpJckI+wyl84P+oYgtZeoBm5m+5vZ98zsETN72MwW5R1YkZat3sIlNz6kFZIyVWuEffSnsiXHvA9UVg1+2ks6Ar8C+Fd3/5CZzQT2yjGmQqndTvrKOsIuYnSsGvy0N3AEbmb7AccDXwdw9+3u/lzOcRVG7XaSiyJGx8N+Q5DoJSmhvAnYClxrZveb2dVmtnfnk8zsbDObMLOJrVvjSYJqt6uxvEsY/RR1uMOR74cP/K2S9zQ18ExMMxsDVgHHuPvdZnYF8Ly7/1mv18R2JqaWnFdclk6LKpxPqQ4RSSHLmZhJauCbgE3ufnfz9veAi9IGV2V1abeL7oMoSYLLWkvu1QJYZFLV4Q6Ss4ElFHd/CthoZvObd50IrM41Kkktuj3Hky5Dz1pL7lbC0NJ3qZmkS+n/J/AtM/s58Hbgstwikkyim4xNmpiz1pK7TfCV1XZXZi1eai1RG6G7PwCkqs1IsY47YjZLJzbx8o7JOCZjk7bAJV3t2K000lnCGKbtLmvpRYttJEcDJzGziG0Ssy5qWQNPep2kE5ZFT4jedEGjZNNy9KcaXSMiHfKaxJRIRDcZG2qSb9CeJVnfs5Xsn12f/PqdtNhGcqQELvHLI0m2j7pHZjZ+Jrenv36RG16pbXHaUQInwtKDTJVHkmwf1U9uhzf/Ebz20GzXH/abRp7tlhK1SiXwMhJpkr1QlOAjELrnunNUP3ZmedvFJknMacpIUhuVOZGnrD7mQe130fVXSxhZ9hnJo10w73ZLiVplEngefcxJtokdtBdKdP3VEk6afUbyWiSUNDFrY6tpqTIllNB9zEm3iR109Niwcan8Mk1kKWEkqW2nqe9r6f60U6k+8JDJ7pIbH+L6let33f74okO59NSjMl0ra1ztHyJ7jo5or/EsYumsSNsrXoXNtqRSou8DD9nHHHJEnzWubuUXJfAUqtZZ0e/DJG0njCYdJYDK1MBDa5VGPr7o0NJGvtprfEhVOjLstkvhnz7Wu8adtNWvNcmpSUcJoFIllDpSDXwIVSkzPHIzfPcM2PnKq/e1L4lPEme350Ac5SEpRPQllDoKWRaadh8GRa5i7Oex26cmbxuZOmKeuHZwOaTbt4leHS6x1P2ldErgkZi2hy9XobOifVHPjD3gmHNfjemRm+Hx5a8+d2Rm93JI0uX+nXX/hefAtueVzKWrWibwqo1UO+PJEp8mREvU75vAY7c3ltq3HHbC1OTe/pok3yY6R+o/+yr4ZDUmcaVyapfAixippknAnfGcdexhXPOzx1PHF91+33XT65tAtyX30LuDZlAC7hztt0o36lSRLmrXhZL3ysm0S+s74/np6qcyxVeFrhrpotcKyKwdNO3XO+ZcdapIX7Ubgec9Uk1bymiPZ+bIDEb3GGHmyAy2T+5MHV90+33XTWdJpP125yENw2xx2z5SP2hME5rSUy3bCPOsgWdZXbls9Ra+ffd67lr3DNsndzJzZAbHvPn1fPRdh1YmIVdt3qBQj9zc6CSB3rsOdrYBLjwHVv394NZBJV9JSG2ETcOMVAclskF7p/SKZ8XarWyfbJRLtk/u5JDX7VWZRDltO1ygkWSXfuLVicjHl8Np3xjcBrjmJ1NvT1zbfXWmErfkqHY18GEkrW+/d8GBXHrqUamSXJVXZdZux8XObV373e7sIpnc3riv8zWdKyfnv6/RMtjy+HKdOi+Fq+UIPKs8WvXaR/RpR+5FqVWHS7c+6lapo9ft1nFp0Ph91n7dO0g62wA3Pwjrbm28rpX4Yxlxq7xTC0rgbdImsn7lls66d6s00bkjYhVqz1nKQpU1qNTx8+9Ovb3t+UbJpL0GnnSjqbEzYf2KcGdxFpVUq7ZJmGRWuwQ+TEJMk8j61Y3bH2vpNqKvUu25Nh0und0f898Hz6x7dYT9wubdDyjuVqvu7CDplfQ6R+VZk3CRSVU7IdZGrRJ4iISYNJF9++71Pcst7aWYlqSn/SR57yqM2itrUKlj5yuDDyjudo2bLuie9NqT/zDL4ItMqsO0OEql1GoSs6jJuGWrt3DXumd23Z45MmNKcm6fsJw5MoPF82d3/TDJMrGpMzoT6DwKbezMqROQY2cOPiqt8xpJtn+94wtTk/BdVyQ/Yq3I7WV1/Fpt1GoEXtRkXKMlcOeu28e8+fVTknPSUkyW2rP2RMkgxK6Gg65x26Ww+YG2OyzdMviid15Ui2Mt1G4hTxHlhayLeULE1e+9VVop0d8vgqdXv3p7rwNgx0vl72Uu0ciykKd2CXwYaTepyrKhVYizMbu9t87fLNltl8KKL716+7jztQxeUtFKzCGknQBN07URuuzR7b2HeQ+N3JvSdpC0P//ESxr3rflJo/Oldbvf8WpK7jKk6Ccxl63ewiU3PjT0ZF6eE6BFrMLM+h6aFG1qdZAknXTs9vwTL4FzVr6avDtXc2Z9L5Eeok7gIZNPnkm2iK1gs75HNMvoeyXDUNJu/zro+f2SdJUOa+5jfMM4l626jPEN42WHIj1EncAHJZ80o/O8k2yW/VOKeI8q79GySxEj1rRtfIOe3y9JR3Ai/fiGcS6880KWrFnChXdeqCReUVHXwPu1DWZZ1FOX1YhpatpRLKMvYpFL2ja+Qc/vt1imKoc197HyyZVsm9wGwLbJbax8ciWL5y4uOSrpFHUC75d8pmu/dC0/uIpaOZi2N7rf8wcl6Yr3YS+as4gfrvsh2ya3MWtkFovmLCo7JOki6gQOvZPPvrNG+94uWlGdHrX84IpgxNpVxZN0P4vnLuby4y9n5ZMrWTRnkUbfFRV9Au/lhW07+t4u0qCNr0Im9ui2hk3aThdxMozV4rmLlbgrLnECN7MRYAJ4wt1PyS+kMPJKZK2Eu++sUV7YtiNR4u01Ks5jN8Ioatot2tZUZChpRuDnAg8D++UUS1B5JLJu28QmSby9PkzyKndUvqbdUtQOfFo0IzWVqI3QzA4GPgBcnW84YaVtqxvUdthtm9gkvdO9WhSjaOHLUxHtdHm0IObdky6SUNIR+FeBC4F9ez3BzM4GzgaYO3fu0IEVLUk5o30k3ZI08XYbFbd/S9h31uiuD4IoRs8hFDE5GXqUX0DZZ3zDuCYPJZGBCdzMTgGedvd7zeyEXs9z96uAq6CxmVWoAIuSpJzRmXCT1sD7ab22KifzFC7vycksLYj9Si45l31aC2i2TW7jh+t+yOXHX64kLj0lGYEfA3zQzN4PzAL2M7Mb3P1j+YZWrKSTnnnUl2vZ+lcVaUf5g0bY3T4QAtbYtYBG0hhYA3f3z7v7we4+D/gIcHvdkjcUs19JL9O+Fp63ztN1+hm0T0nnaTYQtMa+aM4iZo3MAihsAY32PIlXbfvAs0g7ug7Vwx1V619dtUbRs/ZrjKz7lVzayz69zsrMqOgFNCrZxC1VAnf35cDyXCKJzDA93N0SfzStf3XUXjYZ3TPdYcQ5LPNPtIAmUNmmjJKNJmnD0Qg8o2FOlJ+2E5ZV0p4AO8sm255vlFySKGOZf8BOmKL3PNGIP6yot5MtU9a6db8tcEMdTiEDdPaGt8omkG0UnabGHkLA/cRbJZvT559eSDLtNuKX7Go7As9786isdevjjpjNd/7vRrZP7mTmyIxdiV8j8wJ1G3G3j6KhUduu6srNwGWbIvc80S6HYdUygWdJhkkTfufzQiVZtRIWqFsCbE1MxrA/Sw5lm6Lq0trlMKxaJvC0yTBpwg8xSl6xdivbJ3cCsH1y567YottFMGb9EmBR+7MMK+ACqKLr0trlMJxa1sDT1qeTngsZ4vzIXrGV2Yc+LfWqW7fvzzIyE55dX/s9T1SXjle0I/B+JY+09emko98Qo+R+samVsAJao/OJa+Hx5bDuVli/opqllCG0l0xUl46XuYfftmRsbMwnJiaCX7elvZSx5+hIkBFr1hq41NRNFzS6VFqO/lSy1sIA/dl516PbSyazRmZx+fGXA6guXTIzu9fdx9K8JsoReB4TfklHvxolTxNZN8EacgI0ZD261wdBt5LJxQsvVuKOUJQ18CrtHVKH3u06/A3Bde55EmIflQRC1aNbHwRL1izhwjsvnLLPSbf9VrQfSpyiHIGXtXdIZ/mkyLMu81Lp/vOyT9JJ2+kRoD87VD263xL5zlY+IMioX0vkixdlAofiSxndEl2RZ112xhLqw6Gy/ecx9GN3CtCfHapPetAHQXsr32WrLht6PxQtkS9HlCWUMnRLdL1KOSHaDXtpfThcv3I9n15y/9BljyqVo6YIuFy8UAGW1S+eu3jomnSaJfIhtrBVK2I5lMAT6pboyjjrMvSHQ2X7z4s4L7POHrmZxQ/exMX7v33gB0GI/VDK2MdcIm0jLEuS0kXrOaGOXOt2/dAtlJ3Xr0ztvuwaeKw6t8ctqPzUrQauunhyWdoIlcADyju5tr9PHkm2qPino0ITWY8e9mFjSPv6bv3m3V6nJN+QJYGrhNIUopUuz9p3S54j5CLin476tfTlokv5adgYsry+sy6+9NGlu7UqFv5vUzNK4Aw3MfjFW9Zw0lfu4Iu3rMl9QjD0BGanyk5oRq7wCb4uPezDxpDl9e118dEZo6zavGq3RK3Jz+EogZN95PnFW9bwtfF1rNnyIl8bX8eVtz3KWcceltuEYN4j5MpOaEaulAm+jm6YpDH0WtCT5W9onxxd+MaF7Ni5A5iaqOs0+VnGYijVwMle+z3pK3ewZsuLU+7Lc2Jx31mjXPOzx1WjjlAedd4sNel+zx9Us07y+l6P97t2HWrgSev9/WgScwhZasutEXinjy86lEtPPSpYXO0fLmcde1gu3S0SlxAJo9M5Pz2HFU+s2HX79Pmnc/HCi4PFU4dE3ctlqy5jyZolu26n+bdrmTabWeUhy8rOz540H4Af3b+JLc//lld2eu593y9s2xHsw0HKESKRhT5NfnzDOKs2r9p1e3TGaKpyRpJ46nyQQ1lb8iqB95FkVP7Zk+bz2ZPm59YdopN66iXUkvPQCWPlkyt31agBFr5xYaq4pvue4mUdFacSSg9V6onWXuX1EeKrdkvIkkSIkkydSyRFUA08oEtufIjrV67fdTtkXTsPVfrAkd7yqF2HSpx1SsAx/i2qgQcUW+misrsKyhShv2qH3AWwLjXq6bQzovrAe4itJ1qLcFJ65ObGkvMSDiwOsdtgixbC7G46/ZtoBN5HTMenlXXIRZRi3Gu8hyyThzGWF9KYThOqqoHL9JP1wOKKSpOQ86jBV1GMH1KqgUdEHSMlCnD0WZWkqV2H7h+vqrrU8wdRDbwEeW9KJQNkObA4o6odFlynvUdEI/BS1KljJNpvEmkPLM6git0Qi+cu5owFZ7B843JOOOSEXOPJUsaIsfRRJo3AS1CXjhF9k+ivit0Q4xvG+ebqb7L2ubV8c/U3c/tmkGWfb+0Nnp4SeAlia1HsRQdA9FfFckXWD5W0paAs71PFD7yqUwIvyXsXHMilpx4VbfKG+nyTyEuIw4JDy/KhcuV9V3Le+HmpRsZZ3qeKH3hVpzZCGUq0NfBpLG3b4XnLz2PSJ3fdl3T/FtXA09FeKCISVOfmWyOM8JXFX5l2ybUIOtS4AkIcjizST5Gtie1ljREb4ay3nKXkXSEDR+BmdghwPfAGYCdwlbtf0e8103UErh0BJW9lrKQMXdaYzmWSfvJaifkKcL6732dm+wL3mtkyd1+dKcoaq1N/t1RTUSspO5NsyHM8q9YbH7OBJRR33+zu9zV/fwF4GDgo78BipK4MyVvenRrjG8Y556fncP4d5wfrx24v+ahVMKxUKzHNbB7wDuDuLo+dDZwNMHfu3BCxRUc7Akre8jy6q3103DLsKL9zxH3GgjOYNTJrWuwUWITECdzM9gG+D3zG3Z/vfNzdrwKugkYNPFiEkYlpC1qJU3tJI2Q9uX103DJsku0ccb+4/cVSzo6sq0RdKGY2SiN5f8vdf5BvSCKSROil54vmLGJ0xigAhrHgdQuGrlF3K/mEPNBiuhs4AjczA74OPOzuX84/JBFJIo8JzZ2+EwDHWfvc2t0ezzLiP/oNRwNw2u+dpqQdWJIR+DHAGcC7zeyB5k+cx5eI1EjoCc2VT66csuJyx84dUyYZ0474W89f8cQK7nnqnqFik+6SdKH8zN3N3d/q7m9v/hR/kKCITBF6r5X2Ego0yij7zNxn1+20HSTqOMmfVmKKRCxkPXnx3MV86T9+iQWvW8AMm4HjU7acTTvi1+ZU+dOBDiKyy+K5i1n55EpW/7qxTq+9tp62hTHPlkdpUAIvgXbwkyrrd6p72lWZ3Z6vpfThaDfCgpW9X4o+PKopZFILca28kmwZe7nEQqfSR6DM/VLaPzyWTmzSZlsVEXJ/kFDXKmKxUJ57uUwXmsQsWJn7pegItGoatlsjz71G8lgspInNcJTAC1bmeZjabKuahklqnQl2n5n77LrW6IxRNr24aaikG/oDoYrHzMVMNfBpRjXwaspapug8Mef0+aezaM4ilj66lFWbV7Fj546has3D1qw1YZmcauAykDbbqqase2536xhptQLu2LkDGK7WPEwrYB57f+sDYSolcJGI9Uqw/VoB0ybBNB8u7dcOPWF55X1Xcs2D1zDJpA6DaFICj4xKINKpW4LtldizjIqTJvw89/4e3zDONQ81kjeog6VFCTwiagOUNLol9rSj4n4JvzOx57n3d+dGWyOMqIMFdaFERW2AMqwkHS9J2hK7tRfmufd3+7VHbISz3nLWUL3yrb8vdhqBR+S4I2azdGLTrlWcagOUtAZNSiYtg3RL7BcvvDi3vU9C7atSt0OVlcAjojM3pZ/xDeMsfXQpAEe+7khe3P5i12TXb1IyaRmkfZvZ9tshT7DvFOLadVsJqgQeGbUBSjfjG8Y5/47zd7UOrnhiBUDqUWavtsTO17+4/cW+t6uqX3dOjJTARWqgve+7XdpRZtJSRayJsG5b3GolpkgNdI7AW/Lc8U+LasLKshJTCVykJpLWwKWatJReZBrLcwJRqkl94CIikVICFxGJlEooIhKMJjaLpRG4iAQR+vQeGUwJXESCCH16jwymBC4iQei8y+KpBi4iQdRtlWMMlMBFJBj1ohdLJRQRkUhpBC4i00IdWxw1AheR2qtri6MSuIjUXl1bHJXARaT26triqBq4iNReXVsclcBFZFqoY4ujSigiIpFSAhcRiVSiBG5mJ5vZGjNbZ2YX5R2UiIgMNjCBm9kI8DXgfcAC4HQzW5B3YCIi0l+SEfg7gXXu/gt33w58Bzg137BERGSQJAn8IGBj2+1NzfumMLOzzWzCzCa2bt0aKj4REekhSQK3Lvf5bne4X+XuY+4+Nnv27OEjE4nY+IZxLlt1WW2WbEs1JUngm4BD2m4fDDyZTzgi8avrvhtSPUkS+D3AEWZ2mJnNBD4C/DjfsETiVdd9N6R6BiZwd38F+FPgFuBh4Lvu/u95ByYSq7ruuyHVY+67lbOHNjY25hMTE8GvKxKLOu49Lfkys3vdfSzNa7QXikgCaRNyHffdkOrRUnqRATQpKVWlBC4ygCYlpaqUwEUG0KSkVJVq4CID1PUwAImfErhIApqUlCpSCUVEJFJK4CIikVICFxGJlBK4iEiklMBFRCKlBC4iEiklcBGRSCmBi4hESglcRCRSSuAiIpFSAhcRiZT2QhGRoHQaUXE0AheRYHT4RbGUwEUkGB1+USwlcBEJRodfFEs1cBEJRodfFEsJXESC0uEXxVEJRUQkUkrgIiKRUgIXEYmUEriISKSUwEVEIqUELiISKXP38Bc12wqsD3jJA4BfBbxeERRzMWKLObZ4QTEXZb6775vmBbn0gbv77JDXM7MJdx8Lec28KeZixBZzbPGCYi6KmU2kfY1KKCIikVICFxGJVCwJ/KqyA8hAMRcjtphjixcUc1FSx5zLJKaIiOQvlhG4iIh0UAIXEYlUNAnczL5oZo+Y2c/N7Idmtn/ZMXVjZieb2RozW2dmF5UdzyBmdoiZjZvZw2b272Z2btkxJWVmI2Z2v5n9S9mxJGFm+5vZ95r/P37YzCp/2oGZndf8/8VDZrbEzGaVHVMnM7vGzJ42s4fa7nudmS0zs7XN/762zBg79Yg5dY6LJoEDy4Cj3P2twKPA50uOZzdmNgJ8DXgfsAA43cwWlBvVQK8A57v77wMLgf8RQcwt5wIPlx1EClcA/+ruRwJvo+Kxm9lBwKeBMXc/ChgBPlJuVF1dB5zccd9FwG3ufgRwW/N2lVzH7jGnznHRJHB3v9XdX2neXAUcXGY8PbwTWOfuv3D37cB3gFNLjqkvd9/s7vc1f3+BRlI5qNyoBjOzg4EPAFeXHUsSZrYfcDzwdQB33+7uz5UaVDJ7AHua2R7AXsCTJcezG3e/E/h1x92nAt9o/v4N4D8XGdMg3WLOkuOiSeAdzgJ+UnYQXRwEbGy7vYkIkmGLmc0D3gHcXXIoSXwVuBDYWXIcSb0J2Apc2yz7XG1me5cdVD/u/gTwt8AGYDPwG3e/tdyoEjvQ3TdDY5AC/G7J8aSVKMdVKoGb2U+btbbOn1PbnvO/aHzt/1Z5kfZkXe6Lok/TzPYBvg98xt2fLzuefszsFOBpd7+37FhS2AP4Q+Af3P0dwEtU72v9FM268anAYcAcYG8z+1i5UdVfmhxXqTMx3f09/R43s08ApwAnejUb2DcBh7TdPpgKfuXsZGajNJL3t9z9B2XHk8AxwAfN7P3ALGA/M7vB3aucXDYBm9y99e3me1Q8gQPvAR53960AZvYD4D8AN5QaVTJbzOyN7r7ZzN4IPF12QEmkzXGVGoH3Y2YnA58DPuju/6/seHq4BzjCzA4zs5k0Jnx+XHJMfZmZ0ajLPuzuXy47niTc/fPufrC7z6Pxb3x7xZM37v4UsNHM5jfvOhFYXWJISWwAFprZXs3/n5xIxSde2/wY+ETz908AN5YYSyJZclw0KzHNbB3wGuCZ5l2r3P2/lRhSV81R4VdpzNhf4+5/XW5E/ZnZscAK4EFerSdf7O43lxdVcmZ2AnCBu59ScigDmdnbaUy6zgR+AZzp7s+WGtQAZvaXwIdpfKW/H/iku/+23KimMrMlwAk0tpDdAvw58CPgu8BcGh9Ep7l750RnaXrE/HlS5rhoEriIiEwVTQlFRESmUgIXEYmUEriISKSUwEVEIqUELiISKSVwEZFIKYGLiETq/wPMGXcMa2SXRwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(X[Y==0, 0], X[Y==0, 1], s=10, label='cluster1')\n",
"plt.scatter(X[Y==1, 0], X[Y==1, 1], s=10, label='cluster2')\n",
"plt.scatter(X[Y==2, 0], X[Y==2, 1], s=10, label='cluster3')\n",
"plt.title('scatter data')\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def get_neigh(eps, df, index):\n",
" \n",
" x, y = df.iloc[index]['x'], df.iloc[index]['y']\n",
" \n",
"# con1 = np.power(x - df['X'], 2) + np.power(y - df['Y'], 2) <= eps ** 2\n",
"\n",
" con1 = np.abs(x - df['x']) <= eps # 这样写比半径好,为什么?\n",
" con2 = np.abs(y - df['y']) <= eps\n",
" con3 = df.index != index\n",
" \n",
" temp = df[con1 & con2 & con3] # 取得半径内,不为index的多有点\n",
" \n",
" return temp.index"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def grow_cluster(df, visited, labels, idx, C, eps, min_pnts):\n",
" \n",
" '''\n",
" 从idx开始增长一个cluster\n",
" \n",
" \n",
" 1. 把核心节点标记为一个新的簇\n",
" 2. 让核心节点入队\n",
" \n",
" '''\n",
" \n",
" queue = []\n",
" \n",
" labels[idx] = C\n",
" visited[idx] = True\n",
" \n",
" queue.append(idx)\n",
" \n",
" while len(queue) != 0:\n",
" \n",
" cur_idx = queue.pop(0) # 从队列开头弹出一个节点\n",
" \n",
" neigh_indexes = get_neigh(eps, df, cur_idx) # 获得它的邻居数目\n",
" \n",
" if len(neigh_indexes) < min_pnts: # 如果邻居数目少于阈值,它不是核心节点,无法影响邻居\n",
" continue\n",
" \n",
" for neigh_idx in neigh_indexes: # 否则对于所有邻居进行处理\n",
" \n",
" if labels[neigh_idx] == -1: # 如果邻居是异常,修正它,因为它是异常,不可能再影响别的点\n",
" labels[neigh_idx] = C\n",
" continue\n",
" \n",
" if not visited[neigh_idx]: # 对于邻居中未处理的点,把它纳入簇中\n",
" labels[neigh_idx] = C\n",
" visited[neigh_idx] = True\n",
" queue.append(neigh_idx)\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def cluster_with_stack(eps, min_pnts, df):\n",
" \n",
" visited = [False for i in range(len(df))]\n",
" labels = [0 for i in range(len(df))]\n",
" \n",
" C = 0\n",
" \n",
" for idx, row in df.iterrows():\n",
" if visited[idx]:\n",
" continue\n",
" \n",
" neigh_indexes = get_neigh(eps, df, idx)\n",
" if len(neigh_indexes) < min_pnts: # 标记为异常\n",
" labels[idx] = -1\n",
" visited[idx] = True\n",
" else: \n",
" C += 1\n",
" grow_cluster(df, visited, labels, idx, C, eps, min_pnts)\n",
" \n",
" \n",
" return list(zip(df.index,labels))\n",
"\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x254dd697f98>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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NJPwlJtRuXHjRvX29urQoUN65ZVX9NOf/jSMJX4M4QkAkEr1VWUqLS6SJJUWF6m+qiziFYWn/WS7duzfofaT7YG95p49e7R48WItWbJE995775iv3XrrrcoNyz516pQqKyslSUeOHNGNN96ompoaLV68WJlMRlu2bNGJEydUU1OjTZs2SZKeeOIJLV++XIsXL9YjjzwiSXrjjTe0cOFCPfTQQ1q6dKkGBga0cuVKSdIll1yipUuXqq+vL7D3NxV6ngAAqdRQXa5djbWJ73lqP9muzfs2a2hkSC8ef1GP3/y4VlaszOs1jxw5ou3bt+uVV17R7NmzdebMGe3atWva73vyySe1YcMG3XPPPTp37pxGRkb02GOP6fDhw+ru7pYktbS0KJPJ6MCBA7LWau3atdq3b58qKip07NgxPf300x/bqXr//ff1d3/3d9qwYUNe78srwhMAILUaqssTG5pyOt/p1NDIkCRpaGRIne905h2e2tratG7dOs2ePVuSdOWVV3r6vrq6Om3fvl19fX266667VFVV9bHntLS0qKWlRbW1tZKks2fPKpPJqKKiQvPmzdOKFSvGPP9Xv/qVGhsb1dTUpOuuuy6v9+UVZTsAABKsbk6dSopKJEklRSWqm1OX92taa2WMmfTrs2bN0vnz5yVJQ0NDFx9fv369XnrpJZWWlmr16tVqa2ub8LW3bt2q7u5udXd36/jx47r//vslSZdeeunHnv/ggw+qqqpKX/va1/J8V94RngAASLCVFSv1+M2Pq/H6xkBKdpJ022236bnnntPp06clSWfOnBnz9crKSh08eFCS9MILL1x8/PXXX9d1112npqYmrV27Vq+99pouv/xyffDBBxefs3r1au3evVtnz56VJL399tt67733JlzHn/7pn+oXv/iFvvOd7+T9nvygbAcAQMKtrFgZSGjKueGGG7Rt2zbdcsstKioqUm1t7cWmcCl7F9zv/d7v6a//+q+1atWqi48/++yzeuaZZ1RcXKxPfOITevjhh3XllVfqpptu0qJFi/S5z31OTzzxhI4ePaq6uuwO2WWXXaZnnnlGRUVFY9bQ19en7du3a8GCBVq6dKkk6atf/aq+8pWvBPY+J2Nyt/sFadmyZTbXZQ8AAIJz9OhRLVy4MOplxNZE188Yc9Bau8zra1C2AwAA8IHwBAAA4APhCQCAmAmj5SYNgrpuhCcAAGKkpKREp0+fJkD5ZK3V6dOnVVJSkvdrcbcdAAAxMnfuXPX19WlggLP4/CopKdHcuXPzfh3CEwAAMVJcXKxrr7026mWkGmU7AAAAHwhPAAAAPhCeAAAAfAhlwrgxZkDSm4G/sH+zJZ2KehExwHXyjmvlHdfKO66Vd1wrb7hO3s2WdKm1tszrN4QSnlxhjOnyM249rbhO3nGtvONaece18o5r5Q3XybuZXCvKdgAAAD4QngAAAHxIenj6ftQLiAmuk3dcK++4Vt5xrbzjWnnDdfLO97VKdM8TAABA0JK+8wQAABAowhMAAIAPiQ5PxpgnjDG9xpjXjDEvGmN+M+o1ucYY81ljzDFjzHFjzJao1+MqY8w1xph2Y8xRY8wRY8yGqNfkMmNMkTHmkDHmf0S9FpcZY37TGPPChf+fOmqMqYt6Ta4yxvynC//bO2yMaTbGlES9JlcYY3YbY94zxhwe9diVxphWY0zmwsffinKNrpjkWvnOCokOT5JaJS2y1i6W9HNJWyNej1OMMUWS/lLS5yRVS2o0xlRHuypn/UrSN6y1CyWtkPTHXKspbZB0NOpFxMCfS/qf1toFkpaIazYhY8wnJTVJWmatXSSpSNIfRLsqp/w3SZ8d99gWSX9vra2S9PcXPsfE18p3Vkh0eLLWtlhrf3Xh0/2S5ka5HgfdKOm4tfZ1a+05SX8j6c6I1+Qka+271tqfXfjzB8r+kvtktKtykzFmrqQ7JP0g6rW4zBhzhaSbJf2VJFlrz1lr3490UW6bJanUGDNL0m9Ieifi9TjDWrtP0plxD98p6YcX/vxDSf++kGty1UTXaiZZIdHhaZwvS/pp1ItwzCclvTXq8z4RCKZljKmUVCvpnyJeiqu+I2mzpPMRr8N110kakPT0hRLnD4wxl0a9KBdZa9+WtFPSSUnvSvqFtbYl2lU5r9xa+66U/cefpN+OeD1x4SkrxD48GWP+94Ua+Pj/3DnqOduULbv8KLqVOslM8BizK6ZgjLlM0o8lfc1a+8uo1+MaY8znJb1nrT0Y9VpiYJakpZK+Z62tlfRvorQyoQv9OndKulbSHEmXGmP+MNpVIWn8ZIVZ4S8nXNbaz0z1dWPMlyR9XtJtlqFW4/VJumbU53PFVvikjDHFyganH1lr/zbq9TjqJklrjTFrJJVIusIY84y1ll90H9cnqc9am9vBfEGEp8l8RtI/W2sHJMkY87eSPi3pmUhX5bZ+Y8zV1tp3jTFXS3ov6gW5zG9WiP3O01SMMZ+V9J8lrbXWfhj1ehz0qqQqY8y1xphLlG3AfCniNTnJGGOU7U05aq39s6jX4ypr7VZr7VxrbaWy/31qIzhNzFr7L5LeMsZcf+Gh2yT1RLgkl52UtMIY8xsX/rd4m2iun85Lkr504c9fkvSTCNfitJlkhURPGDfGHJf065JOX3hov7X2P0a4JOdc2CH4jrJ3r+y21m6PdkVuMsb8O0kdkv6vPurl+aa1dm90q3KbMeZWSRuttZ+PeCnOMsbUKNtYf4mk1yX9kbX2XyNdlKOMMf9V0u8rW1Y5JOkr1tr/F+2q3GCMaZZ0q6TZkvolPSLpv0t6TlKFsuHzbmvt+Kby1JnkWm2Vz6yQ6PAEAAAQtESX7QAAAIJGeAIAAPCB8AQAAOAD4QkAAMAHwhMAAIAPhCcAAAAfCE8AAAA+/H/Hg2Nmlo0LggAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 720x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"eps = 0.6\n",
"min_pnts = 3\n",
"\n",
"data = pd.DataFrame(X, columns=['x', 'y'])\n",
"\n",
"cluster_result = cluster_with_stack(eps, min_pnts, data)\n",
"idx, cluster = list(zip(*cluster_result))\n",
"cluster_df = pd.DataFrame(cluster_result, columns=['idx', 'cluster'])\n",
"\n",
"\n",
"plt.figure(figsize=(10,7))\n",
"for clust in np.unique(cluster):\n",
" cluster_idx = cluster_df[cluster_df['cluster'] == clust]['idx'].values\n",
" plt.scatter(X[cluster_idx, 0],\n",
" X[cluster_idx, 1],\n",
" s=10,\n",
" label=f'cluster{clust}'\n",
" )\n",
" \n",
"plt.legend([f'cluster{clust}' for clust in np.unique(cluster)], loc='lower right')"
]
}
],
"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.12"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment