You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

289 lines
25 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TP1 KMEANS\n",
"\n",
"On nous propose de coder l'algorithme des kmeans afin de faire du clustering sur 2 classes puis plus de 2 classes.\n",
"Plus tard, on utilisera notre algorithme pour segmenter une image sur l'information de couleur."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import scipy.spatial"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# mean = [1,2,3,4]\n",
"# sd = [0.25, 0.25, 0.1, 0.2]\n",
"# clusters = 4\n",
"mean = [1,2]\n",
"sd = [0.25, 0.25]\n",
"dim = 2\n",
"nb = 10\n",
"clusters = 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Fonctions à utiliser pour le clustering"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def gen_points(mean=1,sd=0.5, nb=100, dim=2, clusters=2):\n",
" size = []\n",
" # for i in range(0,dim):\n",
" size.append(nb)\n",
" size.append(dim)\n",
" points = np.random.normal(mean[0],sd[0],size=size)\n",
" for i in range(1,clusters):\n",
" points = np.concatenate((points,np.random.normal(mean[i],sd[i],size=size)),axis=0)\n",
" \n",
" return points"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def distance(points,Pc): \n",
" return scipy.spatial.distance.cdist(points[:,:], points[:,:])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def kmeans(points = [0,0], K = 1, nb=1, dim=2):\n",
" # Initialisation K prototypes\n",
" Pc_index = []\n",
" for i in range(0,K):\n",
" Pc_index.append(np.random.randint(0,nb*dim))\n",
" Pc = points[Pc_index,:]\n",
"\n",
" return Pc"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def visualisation(points, Pc=[0,0], dim=2):\n",
" if(dim==2):\n",
" plt.plot(points[:,0], points[:,1], 'o')\n",
" plt.plot(Pc[:,0],Pc[:,1],'r+')\n",
" plt.grid(True)\n",
" plt.axis([min(mean)-1,max(mean)+1,min(mean)-1,max(mean)+1])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(20, 2)\n"
]
}
],
"source": [
"points = gen_points(mean,sd,nb,dim,clusters)\n",
"print(points.shape)\n",
"# print(points)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0. 0.39108103 0.34583518 0.70546644 0.3203134 0.3516725\n",
" 0.67971143 0.12125982 0.61902803 0.25895127 1.56135251 1.16925868\n",
" 0.89449237 1.43352053 1.0743239 0.93510189 1.41988547 1.58011875\n",
" 1.08411331 1.18671248]\n",
" [0.39108103 0. 0.41265824 0.31753789 0.20134828 0.1520557\n",
" 0.29442779 0.48416069 0.32820193 0.29379395 1.92061143 1.55795192\n",
" 1.2792717 1.80777689 1.45979562 1.32616725 1.80571725 1.97050583\n",
" 1.47031622 1.56670796]\n",
" [0.34583518 0.41265824 0. 0.62859739 0.21220435 0.49592519\n",
" 0.67380419 0.31854927 0.73773146 0.51626889 1.8336252 1.37308473\n",
" 1.01281801 1.49334278 1.29787751 1.11001289 1.52748312 1.75952011\n",
" 1.30415796 1.42577374]\n",
" [0.70546644 0.31753789 0.62859739 0. 0.44061757 0.42670666\n",
" 0.13916838 0.7887133 0.38129538 0.58971012 2.2340252 1.87432417\n",
" 1.58220205 2.09814273 1.77707512 1.63872881 2.10818677 2.28550213\n",
" 1.78747095 1.88420608]\n",
" [0.3203134 0.20134828 0.21220435 0.44061757 0. 0.30494113\n",
" 0.46740546 0.36865442 0.52868835 0.37372177 1.88068426 1.46844245\n",
" 1.14902285 1.65807412 1.3803439 1.21975293 1.67330997 1.8710176\n",
" 1.38894595 1.49825024]\n",
" [0.3516725 0.1520557 0.49592519 0.42670666 0.30494113 0.\n",
" 0.35637593 0.46606861 0.27034798 0.16380212 1.81240225 1.48388867\n",
" 1.24193007 1.78456017 1.37947088 1.26763783 1.76514842 1.90097935\n",
" 1.39123292 1.47795072]\n",
" [0.67971143 0.29442779 0.67380419 0.13916838 0.46740546 0.35637593\n",
" 0. 0.77794127 0.24735327 0.51809049 2.16596566 1.83655551\n",
" 1.57217378 2.1022043 1.7339787 1.61275974 2.09839429 2.25219229\n",
" 1.74541605 1.83405921]\n",
" [0.12125982 0.48416069 0.31854927 0.7887133 0.36865442 0.46606861\n",
" 0.77794127 0. 0.73558536 0.38006228 1.52663824 1.09978826\n",
" 0.79543522 1.32585453 1.01264344 0.85309758 1.32192905 1.50347121\n",
" 1.02093103 1.13291852]\n",
" [0.61902803 0.32820193 0.73773146 0.38129538 0.52868835 0.27034798\n",
" 0.24735327 0.73558536 0. 0.38834 1.99112336 1.71317083\n",
" 1.50027904 2.04749497 1.6029451 1.51251266 2.01963574 2.13226014\n",
" 1.61597543 1.69022564]\n",
" [0.25895127 0.29379395 0.51626889 0.58971012 0.37372177 0.16380212\n",
" 0.51809049 0.38006228 0.38834 0. 1.64887732 1.33143897\n",
" 1.11366524 1.66342238 1.22437768 1.12471467 1.63153555 1.74982768\n",
" 1.23666771 1.31925162]\n",
" [1.56135251 1.92061143 1.8336252 2.2340252 1.88068426 1.81240225\n",
" 2.16596566 1.52663824 1.99112336 1.64887732 0. 0.58770443\n",
" 1.02271415 1.15136496 0.58808445 0.83705754 0.94499234 0.6037414\n",
" 0.59102406 0.44614399]\n",
" [1.16925868 1.55795192 1.37308473 1.87432417 1.46844245 1.48388867\n",
" 1.83655551 1.09978826 1.71317083 1.33143897 0.58770443 0.\n",
" 0.44427897 0.64604338 0.12332713 0.27518253 0.47328172 0.41918021\n",
" 0.10638777 0.1741561 ]\n",
" [0.89449237 1.2792717 1.01281801 1.58220205 1.14902285 1.24193007\n",
" 1.57217378 0.79543522 1.50027904 1.11366524 1.02271415 0.44427897\n",
" 0. 0.55487036 0.44065169 0.19125029 0.52649414 0.76267241\n",
" 0.43456127 0.57921824]\n",
" [1.43352053 1.80777689 1.49334278 2.09814273 1.65807412 1.78456017\n",
" 2.1022043 1.32585453 2.04749497 1.66342238 1.15136496 0.64604338\n",
" 0.55487036 0. 0.7423045 0.62079242 0.20929273 0.61317826\n",
" 0.7258323 0.81728057]\n",
" [1.0743239 1.45979562 1.29787751 1.77707512 1.3803439 1.37947088\n",
" 1.7339787 1.01264344 1.6029451 1.22437768 0.58808445 0.12332713\n",
" 0.44065169 0.7423045 0. 0.25088095 0.58359133 0.5339439\n",
" 0.01763323 0.14206747]\n",
" [0.93510189 1.32616725 1.11001289 1.63872881 1.21975293 1.26763783\n",
" 1.61275974 0.85309758 1.51251266 1.12471467 0.83705754 0.27518253\n",
" 0.19125029 0.62079242 0.25088095 0. 0.52473292 0.65180514\n",
" 0.24624553 0.3914113 ]\n",
" [1.41988547 1.80571725 1.52748312 2.10818677 1.67330997 1.76514842\n",
" 2.09839429 1.32192905 2.01963574 1.63153555 0.94499234 0.47328172\n",
" 0.52649414 0.20929273 0.58359133 0.52473292 0. 0.40874924\n",
" 0.56617043 0.63624877]\n",
" [1.58011875 1.97050583 1.75952011 2.28550213 1.8710176 1.90097935\n",
" 2.25219229 1.50347121 2.13226014 1.74982768 0.6037414 0.41918021\n",
" 0.76267241 0.61317826 0.5339439 0.65180514 0.40874924 0.\n",
" 0.51939313 0.48569502]\n",
" [1.08411331 1.47031622 1.30415796 1.78747095 1.38894595 1.39123292\n",
" 1.74541605 1.02093103 1.61597543 1.23666771 0.59102406 0.10638777\n",
" 0.43456127 0.7258323 0.01763323 0.24624553 0.56617043 0.51939313\n",
" 0. 0.14516702]\n",
" [1.18671248 1.56670796 1.42577374 1.88420608 1.49825024 1.47795072\n",
" 1.83405921 1.13291852 1.69022564 1.31925162 0.44614399 0.1741561\n",
" 0.57921824 0.81728057 0.14206747 0.3914113 0.63624877 0.48569502\n",
" 0.14516702 0. ]]\n"
]
}
],
"source": [
"dist = distance(points,Pc=[0,0])\n",
"print(dist)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1.2631266 0.8529462 ]\n",
" [1.1325475 1.17318217]]\n"
]
}
],
"source": [
"Pc = kmeans(points,K=2,nb=nb,dim=dim)\n",
"print(Pc)\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGiCAYAAADA0E3hAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAswUlEQVR4nO3df3RU9Z3/8dckhozUJJq4yQw/xBQUDZFA0ODgOQUsMVA225ye41pPKaxVd+XAHtns0YV+e5qmdJu2imiVBT2u5qwsxWK/4Bd/xE4DgaPEzULILiGVVppC184kK9EJhCZOZ+73D0zMmJmQmdxk5k6ej3NydG4+d+aT97kdX72fz+d+bIZhGAIAALCAlHh3AAAAYKQILgAAwDIILgAAwDIILgAAwDIILgAAwDIILgAAwDIILgAAwDIILgAAwDIILgAAwDIILgAAwDKiCi7bt2/X3LlzlZmZqczMTLlcLr355pvDnrNnzx7ddNNNstvtuuWWW/TGG2+MqsMAAGDiiiq4TJs2TT/60Y907NgxHT16VHfeeae++tWv6uTJk2HbHzlyRPfee6/uv/9+HT9+XBUVFaqoqFBra6spnQcAABOLbbSbLGZnZ+uxxx7T/fffP+R399xzj3p6evTaa68NHLv99ts1b9487dixYzQfCwAAJqArYj0xEAhoz5496unpkcvlCtumsbFRlZWVIcfKysq0b9++Yd+7r69PfX19A6+DwaC6urqUk5Mjm80Wa5cBAMA4MgxD58+f15QpU5SSYs602qiDy4kTJ+RyudTb26urrrpKe/fuVUFBQdi2Xq9XeXl5Icfy8vLk9XqH/YyamhpVV1dH2zUAAJCA/vCHP2jatGmmvFfUwWX27NlqaWmRz+fTK6+8ojVr1ujQoUMRw0ssNm3aFHKnxufz6brrrtNvfvMbZWdnm/Y5E43f79fBgwe1dOlSpaWlxbs7lkYtzUMtzUEdzUMtzdPV1aUbb7xRGRkZpr1n1MFl0qRJmjVrliRpwYIF+s///E899dRTevbZZ4e0dTgc6ujoCDnW0dEhh8Mx7Gekp6crPT19yPHs7Gzl5ORE22V8yu/3a/LkycrJyeF/jKNELc1DLc1BHc1DLc1n5jSPUQ84BYPBkPkog7lcLtXX14ccc7vdEefEAAAADCeqOy6bNm3SihUrdN111+n8+fPatWuXGhoa9NZbb0mSVq9eralTp6qmpkaS9PDDD2vx4sXasmWLVq5cqd27d+vo0aN67rnnzP9LAABA0osquHR2dmr16tXyeDzKysrS3Llz9dZbb6m0tFSSdPbs2ZBZw4sWLdKuXbv0ne98R9/+9rd1ww03aN++fSosLDT3rwAAABNCVMHlX//1X4f9fUNDw5Bjd999t+6+++6oOgUAABAOexUBAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLILgAAADLuCLeHQCAsRYIGmpq71Ln+V7lZthVkp+t1BRbvLsFIAYEFwBJra7Vo+r9bfL4egeOObPsqiov0PJCZxx7BiAWDBUBSFp1rR6t3dkcElokyevr1dqdzapr9cSpZwBiRXABkJQCQUPV+9tkhPld/7Hq/W0KBMO1AJCoCC4AklJTe9eQOy2DGZI8vl41tXeNX6cAjBrBBUBS6jwfObTE0g5AYiC4AEhKuRl2U9sBSAwEFwBJqSQ/W84suyIterbp0uqikvzs8ewWgFEiuABISqkpNlWVF0jSkPDS/7qqvIDnuQAWQ3ABkLSWFzq1fVWxHFmhw0GOLLu2ryrmOS6ABfEAOgBJbXmhU6UFDp6cCyQJgguApJeaYpNrZk68uwHABAwVAQAAyyC4AAAAyyC4AAAAyyC4AAAAyyC4AAAAyyC4AAAAyyC4AAAAy4gquNTU1Oi2225TRkaGcnNzVVFRoVOnTg17Tm1trWw2W8iP3c6mZgAAIHpRBZdDhw5p3bp1evfdd+V2u+X3+3XXXXepp6dn2PMyMzPl8XgGfs6cOTOqTgMAgIkpqifn1tXVhbyura1Vbm6ujh07pi996UsRz7PZbHI4HCP+nL6+PvX19Q287u7uliT5/X75/f5ouoxB+mtHDUePWpqHWpqDOpqHWppnLGo4qkf++3w+SVJ29vDbwl+4cEEzZsxQMBhUcXGxfvjDH2rOnDkR29fU1Ki6unrI8YMHD2ry5Mmj6TIkud3u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DIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwDIILAACwjCvi3QFgLAWChprau9R5vle5GXaV5GcrNcUW724BAGJEcEHSqmv1qHp/mzy+3oFjziy7qsoLtLzQGceeAQBixVARklJdq0drdzaHhBZJ8vp6tXZns+paPXHqGQBgNLjjgqQTCBqq3t8mI8zvDEk2SdX721Ra4EioYSOzh7UYJgOQjAguSDpN7V1D7rQMZkjy+HrV1N4l18yc8evYMPqHtf78wR/1jZY39YN5K3TF1CkxD2sxTAYgWTFUhKTTeT5yaIml3VgbPKyVe6FLG975mXIvdMU8rMUwGYBkRnBB0snNsJvabixdblhLujSsFQiGazH27wcAiYahIiSdkvxsObPs8vp6w/4H3CbJkXVpzke8NbV36c8f/FFzLnRJkgo7Tof8U5I6L2SPeFjLisNkABANgguSTmqKTVXlBVq7s1k2KSS89E9NrSovSIiJqp3ne/WNlje14Z2fhRz/cd3TA//+5B33qvP8nSN+PzPbAUCiIbggKS0vdGr7quIhE1QdCTZBNTfDrh/MWyH3rIWSLt1p+XHd0/qn5X+v1ryZkqTOq7L1U5OHvxJhmAwAYkFwQdJaXuhUaYEjoZcEl+Rn64qpU9Tmyw65M9SaN1MnHbOiHtay0jAZAMSCyblIaqkpNrlm5uir86bKNTMnoUKL9NmwlvTZMFa/WIa1zH4/AEg0BBcgzvqHtRxZdnVelX1pTstV2XJk2bV9VXHUw1qD32+wWN8PABIJQ0VAAggd1rpTPx3lsJYVhskAIBYEFyBB9A9rJer7AUAiYKgIAABYBsEFAABYBsEFAABYBsEFAABYBpNzYTmBoMFqGQCYoAgusJS6Vs+Qx/g7E+wx/gCAscNQESyjrtWjtTubh+x+7PX1au3OZtW1euLUMwDAeCG4wBICQUPV+9vC7r/Tf6x6f5sCwXAtAADJguACS2hq7xpyp2UwQ5LH16um9q7x6xQAYNwRXGAJnecjh5ZY2gEArCnq4HL48GGVl5drypQpstls2rdv32XPaWhoUHFxsdLT0zVr1izV1tbG0FWMlUDQUOPpc3q15QM1nj6XkMMt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y7Zt23T99dfLbrdr4cKFampqiti2trZWNpst5MduZ58aAAAQvaiDy8svv6zKykpVVVWpublZRUVFKisrU2dnZ8RzMjMz5fF4Bn7OnDkzqk4DAICJKerg8sQTT+jBBx/Ufffdp4KCAu3YsUOTJ0/WCy+8EPEcm80mh8Mx8JOXlzeqTgMAgIkpqifnfvLJJzp27Jg2bdo0cCwlJUXLli1TY2NjxPMuXLigGTNmKBgMqri4WD/84Q81Z86ciO37+vrU19c38Lq7u1uS5Pf75ff7o+kyBumvHTUcPWppHmppDupoHmppnrGoYVTB5cMPP1QgEBhyxyQvL0/vvfde2HNmz56tF154QXPnzpXP59Pjjz+uRYsW6eTJk5o2bVrYc2pqalRdXT3k+MGDBzV58uRouoww3G53vLuQNKileailOaijeajl6F28eNH09xzzvYpcLpdcLtfA60WLFunmm2/Ws88+q82bN4c9Z9OmTaqsrBx43d3drenTp2vp0qXKyWHvm1j5/X653W6VlpYqLS0t3t2xNGppHmppDupoHmppnnPnzpn+nlEFl2uvvVapqanq6OgIOd7R0SGHwzGi90hLS9P8+fP1/vvvR2yTnp6u9PT0sOdyEY0edTQPtTQPtTQHdTQPtRy9sahfVJNzJ02apAULFqi+vn7gWDAYVH19fchdleEEAgGdOHFCTqczup4CAIAJL+qhosrKSq1Zs0a33nqrSkpK9OSTT6qnp0f33XefJGn16tWaOnWqampqJEnf//73dfvtt2vWrFn6+OOP9dhjj+nMmTN64IEHzP1LAABA0os6uNxzzz363//9X333u9+V1+vVvHnzVFdXNzBh9+zZs0pJ+exGzkcffaQHH3xQXq9X11xzjRYsWKAjR46ooKDAvL8CAABMCDFNzl2/fr3Wr18f9ncNDQ0hr7du3aqtW7fG8jEAAAAh2KsIAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABYBsEFAABY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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"visualisation(points, Pc, dim=dim)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.8.10 64-bit",
"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.8.10"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}