M2_SETI/D3/TP/TP_SETI_Kmeans/TP1.ipynb
2022-12-05 09:01:01 +01:00

295 lines
38 KiB
Text

{
"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": 196,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import scipy.spatial\n",
"from skimage import io"
]
},
{
"cell_type": "code",
"execution_count": 197,
"metadata": {},
"outputs": [],
"source": [
"# mean = [1,2,3,4]\n",
"# sd = [0.25, 0.25, 0.1, 0.2]\n",
"clusters = 5\n",
"dim = 2\n",
"nb = 100\n",
"K= clusters\n",
"mean = np.random.randint(5, size=clusters)\n",
"mean = mean.T * np.random.random(size=clusters)\n",
"sd = np.random.random(size=clusters)*0.5\n",
"path_image = \"fruits.jpg\"\n",
"# print(mean)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Fonctions à utiliser pour le clustering"
]
},
{
"cell_type": "code",
"execution_count": 198,
"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, mean"
]
},
{
"cell_type": "code",
"execution_count": 199,
"metadata": {},
"outputs": [],
"source": [
"def distance(points,Pc): \n",
" return scipy.spatial.distance.cdist(points[:,:], Pc[:,:])"
]
},
{
"cell_type": "code",
"execution_count": 200,
"metadata": {},
"outputs": [],
"source": [
"def kmeans(points = [0,0], K = 1):\n",
" # Initialisation K prototypes\n",
" dim = points.shape[1]\n",
" N = points.shape[0]\n",
" iter = 0\n",
" eps = 0.1\n",
" Pc_index = []\n",
" Pc_save = np.zeros([K,dim])\n",
" clusters = []\n",
"\n",
" for i in range(0,K):\n",
" Pc_index.append(np.random.randint(0,N))\n",
" Pc = points[Pc_index,:]\n",
"\n",
" while (np.mean(distance(Pc,Pc_save)) > eps and iter < 5):\n",
" iter += 1\n",
" Pc_save = Pc\n",
" # print(Pc)\n",
" # print(points[:,:Pc.shape[0]])\n",
" dist = distance(points=points[:,:Pc.shape[1]],Pc=Pc)\n",
" clust = np.argmin(dist, axis=1)\n",
" clust = np.expand_dims(clust, axis=0)\n",
" points = np.append(points[:,:Pc.shape[1]], clust.T, axis=1)\n",
" # print(points)\n",
" Pc = np.zeros([K,dim])\n",
" index = np.array([])\n",
"\n",
" for n in range(0,N):\n",
" for k in range(0,K):\n",
" index = np.append(index, (clust==k).sum())\n",
" if points[n,-1] == k:\n",
" # print(points)\n",
" # print(Pc)\n",
" Pc[k,:] = np.add(Pc[k,:], points[n,:-1])\n",
"\n",
" for k in range(0,K):\n",
" Pc[k,:] = np.divide(Pc[k,:],index[k])\n",
"\n",
" # print(Pc)\n",
" indice = points[:,-1]\n",
" points = points[:,:-1]\n",
" return Pc, indice, points\n"
]
},
{
"cell_type": "code",
"execution_count": 201,
"metadata": {},
"outputs": [],
"source": [
"colors=['red', 'green','yellow','blue','purple', 'orange']\n",
"def visualisation(points, index, Pc=[0,0], K=1):\n",
" if(points.shape[1]==2):\n",
" # for k in range(0,K):\n",
" for n in range(0,len(points)):\n",
" plt.plot(points[n,0], points[n,1], 'o', color=colors[int(index[n])])\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": 202,
"metadata": {},
"outputs": [],
"source": [
"def img_2_mat(my_img):\n",
" mat = my_img.reshape(my_img.shape[0]*my_img.shape[1],my_img.shape[2])\n",
" return mat"
]
},
{
"cell_type": "code",
"execution_count": 203,
"metadata": {},
"outputs": [],
"source": [
"def mat_2_img(mat,my_img):\n",
" img_seg = mat.reshape(my_img.shape[0], my_img.shape[1], my_img.shape[2])\n",
" return img_seg"
]
},
{
"cell_type": "code",
"execution_count": 204,
"metadata": {},
"outputs": [],
"source": [
"def kmeans_image(path_image, K):\n",
" my_img = io.imread(path_image)\n",
" imgplot = plt.imshow(my_img)\n",
" Mat = img_2_mat(my_img)\n",
" \n",
" Pc, index, clusters = kmeans(Mat, K)\n",
"\n",
" for k in range(Mat.shape[0]):\n",
" Mat[k,:] = np.floor(Pc[index[k],:])\n",
"\n",
" img_seg = mat_2_img(Mat, my_img)\n",
"\n",
" io.imsave(path_image.split('.')[0] + \"_%d.jpg\" % K, img_seg)\n",
" imgplot = plt.imshow(img_seg)\n",
" return Pc, index, img_seg\n"
]
},
{
"cell_type": "code",
"execution_count": 205,
"metadata": {},
"outputs": [],
"source": [
"points, mean = gen_points(mean,sd,nb,dim,clusters)\n",
"# print(points.shape)\n",
"# print(points.mean(axis=0))\n",
"# print(points)"
]
},
{
"cell_type": "code",
"execution_count": 206,
"metadata": {},
"outputs": [],
"source": [
"dist = distance(points,points)\n",
"# print(dist)"
]
},
{
"cell_type": "code",
"execution_count": 207,
"metadata": {},
"outputs": [],
"source": [
"Pc, index, clusters = kmeans(points,K=K)\n",
"# print(index)\n",
"# print(clusters)\n"
]
},
{
"cell_type": "code",
"execution_count": 208,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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3NVCRERuYyBCpsy2+bY3tXNXCxERZYXJqmSJu1qIiMgtDERICHe1EBGRG7g0Q0RERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5hIEJERESeYSBCREREnmEgQkRERJ5xLRC5++67MXv2bEyaNAmf+MQn3LoNERERBZhrgciRI0dwySWX4JprrnHrFkRERBRw49y6cHNzMwDgiSeecOsWREREFHCuBSKZOHz4MA4fPjz6+f79+wEA+/bt82pIZMPw8DAOHTqE/v5+FBcXez0cMsH3Klj4fgUH3yvV4OAgAEBRFMtzfRWI3HPPPaMzKYk+9alPeTAaIiIiysbg4CCOPfZY03NsBSLf+c53cO+995qe09nZidNOO83OZUfddtttWLFixejnH330EU488UTs2rXL8hsh7w0MDKC6uhq7d+9GOBz2ejhkgu9VsPD9Cg6+VypFUTA4OIhp06ZZnmsrELnppptw5ZVXmp5z0kkn2blkkgkTJmDChAlpx4899tiCfkODJhwO8/0KCL5XwcL3Kzj4XkF4AsFWIFJRUYGKioqMBkRERESUyrUckV27dmHfvn3YtWsXZFnGm2++CQA45ZRTMHnyZLduS0RERAHiWiByxx134Mknnxz9/DOf+QwAYPPmzaivrxe6xoQJE3DnnXfqLteQ//D9Cg6+V8HC9ys4+F7ZJykie2uIiIiIXMBeM0REROQZBiJERETkGQYiRERE5BkGIkREROSZwAQid999N2bPno1JkybhE5/4hNfDoRQPP/wwamtrMXHiRJxzzjn44x//6PWQSMeLL76IBQsWYNq0aZAkCb/61a+8HhIZuOeee3D22WejtLQUU6dOxcUXX4w///nPXg+LDDzyyCP49Kc/PVrIbNasWXj22We9HlYgBCYQOXLkCC655BJcc801Xg+FUvzyl7/EihUrcOedd+KNN97AWWedhS9/+cv44IMPvB4apTh48CDOOussPPzww14PhSxs2bIF1113HV555RVs2rQJw8PDuOCCC3Dw4EGvh0Y6IpEIfvCDH+D111/Ha6+9hi996UtoaGjAW2+95fXQfC9w23efeOIJLF++HB999JHXQ6ER55xzDs4++2z8+Mc/BgDE43FUV1fj+uuvx3e+8x2PR0dGJEnChg0bcPHFF3s9FBLQ19eHqVOnYsuWLfiHf/gHr4dDAqZMmYL77rsP3/jGN7weiq8FZkaE/OnIkSN4/fXXMXfu3NFjRUVFmDt3LrZt2+bhyIjyy/79+wGoDzfyN1mWsW7dOhw8eBCzZs3yeji+51plVSoMe/fuhSzLOP7445OOH3/88Xj77bc9GhVRfonH41i+fDn+/u//HmeccYbXwyED27dvx6xZs/Dxxx9j8uTJ2LBhA2bOnOn1sHzP0xmR73znO5AkyfQ/PsyIqNBdd911+NOf/oR169Z5PRQyMX36dLz55pv4wx/+gGuuuQZXXHEFduzY4fWwfM/TGZGbbroJV155pek5J510Um4GQxkpLy9HKBTC+++/n3T8/fffxwknnODRqIjyx9KlS/Gb3/wGL774IiKRiNfDIRPjx4/HKaecAgD43Oc+h1dffRWtra149NFHPR6Zv3kaiFRUVKCiosLLIVCWxo8fj8997nN44YUXRpMe4/E4XnjhBSxdutTbwREFmKIouP7667FhwwZ0dHTgk5/8pNdDIpvi8TgOHz7s9TB8LzA5Irt27cK+ffuwa9cuyLKMN998EwBwyimnYPLkyd4OrsCtWLECV1xxBT7/+c/jC1/4AlpaWnDw4EF8/etf93polOLAgQN45513Rj/fuXMn3nzzTUyZMgU1NTUejoxSXXfddVizZg2efvpplJaW4r333gMAHHvssSgpKfF4dJTqtttuw4UXXoiamhoMDg5izZo16OjowHPPPef10PxPCYgrrrhCAZD23+bNm70eGimK8tBDDyk1NTXK+PHjlS984QvKK6+84vWQSMfmzZt1/x5dccUVXg+NUui9TwCU//iP//B6aKTjn//5n5UTTzxRGT9+vFJRUaGcf/75yvPPP+/1sAIhcHVEiIiIKH+wjggRERF5hoEIEREReYaBCBEREXmGgQgRERF5hoEIEREReYaBCBEREXmGgQgRERF5hoEIEREReYaBCBEREXmGgQgRERF5hoEIEREReYaBCBEREXnm/welEjvJrra/IgAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"visualisation(clusters, index, Pc, K=K)\n",
"# print(Pc)\n",
"# print(mean)"
]
},
{
"cell_type": "code",
"execution_count": 209,
"metadata": {},
"outputs": [],
"source": [
"# for k in range(1,50):\n",
"# Pc, index, img_seg = kmeans_image(path_image=path_image, K=k)"
]
},
{
"cell_type": "code",
"execution_count": 210,
"metadata": {},
"outputs": [],
"source": [
"# print(index.shape)\n",
"# print(Pc)\n",
"# print(img_seg)"
]
}
],
"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
}