"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introducción\n",
"\n",
"En este post se va a exponer una nueva modelo de análisis estadístico multivariante que se encuadra dentro de los métodos denominados genéricamente como algoritmos de tipo clúster. Se trata de una serie de **métodos no supervisados** que permiten agrupar los datos con una distancia menor entre ellos, así como maximizar la distancia entre los diversos grupos.\n",
"\n",
"\n",
"# El método k-means\n",
"\n",
"Uno de los métodos más utilizados para este tipo de análisis estadístico es el popularmente conocido como **método k-means**. Este método es fácil de implementar y al mismo tiempo no es muy expansivo en cuanto a recursos computacionales se refiere, de ahí proviene la popularidad del método. \n",
"\n",
"El método k-means pertenece a la categoría de los métodos **denominados prototype-based**, los cuales se basan en la idea de que cada clúster está representado por un prototipo, el cual es denominado **centroide** ( punto medio de los puntos) para variables o features de tipo continuo, o **medoid** ( puntos más representativos o frecuentes) en el caso de variables o features de tipo categórico. \n",
"\n",
"Uno de los mayores inconvenientes de este método es que a priori se debe especificar el valor k relativo al número de clúster's a obtener. Sin embargo existe alguna técnica que ayuda o obtener un valor óptimo de k, enter ellas se pueden destacar el **método de elbow** y el gráfico denominado **silhouette**.\n",
"\n",
"Comenzamos exponiendo este método para un ejemplo sencillo de dos dimensiones, con la finalidad de que el lector pueda apreciar de forma más clara las características de este modelo.\n",
"\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.datasets import make_blobs\n",
"X, y = make_blobs(n_samples=150,\n",
" n_features=2,\n",
" centers=3,\n",
" cluster_std=0.5,\n",
" shuffle=True,\n",
" random_state=0)\n",
"#Procedemos a su representación gráfica\n",
"import matplotlib.pyplot as plt\n",
"plt.scatter(X[:,0],\n",
" X[:,1],\n",
" c='black',\n",
" marker='x')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A efectos didácticos, se han obtenido 150 puntos en dos dimensiones, que forman claramente tres grupos de datos, que este algoritmo detectará. Esta situación ideal en el mundo real es difícil que se de, y lo más probable es que exista una mezcla de puntos entre grupos que hagan más difícil identificar los cluster's. \n",
"\n",
"Los pasos que sigue este algoritmo, de forma resumida, son los siguientes (siendo k el número de clúster's elegidos ):\n",
"\n",
"1.- Se eligen k centroides iniciales intentado sean los más representativos de cada clase.\n",
"\n",
"2.- Cada punto se asigna al centroide \\\\( \\mu_j \\; j\\epsilon{1,2,...,k} \\\\) más cercano.\n",
"\n",
"3.- Recalcular los centroides con los nuevos puntos asignados.\n",
"\n",
"4.- Repetir los pasos 2 y 3 hasta que se cumpla el criterio de tolerancia que se haya definido o bien se sobrepase el número de iteraciones asignadas.\n",
"\n",
"Una de las cuestiones claves de este método en la *medición de la similitud entre objetos*, para ello lo que hay que tener definido es una determinada distancia. En el caso de variables de tipo continuo, una de las distancias más utilizadas es la distancia euclidea que se define de la siguiente manera:\n",
"\n",
"\\\\[ d(x,y)^2=\\sum_{i=1}^m (x_i-y_i)^2=||x-y||_2^2 \\\\]\n",
"\n",
"Una nota sobre nomenclatura a utilizar en este post. El subíndice i con carácter general se va a utilizar para representar las filas de la muestra y el j para hacer referencia a los clúster con los que se trabaja.\n",
"\n",
"Basado en la distancia euclídea, este algoritmo lo que va a conseguir es minimizar la suma de cuadrados dentro del clúster (SEE) mediante un método de aproximaciones sucesivas. El valor de SEE también es conocido como **clúster inertia**.\n",
"\n",
"\n",
"\\\\[ SEE= \\sum_{i=1}^m \\sum_j ^k w^{(i,j)} ||x^{(i)}-\\mu^{(j)}||_2^2 \\\\]\n",
"\n",
"Donde \\\\( \\mu^{(j)} \\\\) es el punto representativo o centroide del clúster j y \\\\( w^{(i,j)}\\\\) es igual a 1 si la muestra es del clúster j y cero en caso contrario.\n",
"\n",
"Una vez expuestas las ideas que subyacen a este método, a continuación se pasa a mostrar un ejemplo clarificador de cómo utilizar este método con scikit-learn. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.cluster import KMeans\n",
"km = KMeans(n_clusters=3,\n",
" init='random',\n",
" n_init=10,\n",
" max_iter=300,\n",
" tol=1e-04,\n",
" random_state=0)\n",
"y_km = km.fit_predict(X)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En el código anterior los parámetros utilizados más importantes tienen el siguiente significado:\n",
"\n",
"1.- **init='random'**. Es para indicar que elija una serie de centroides de forma aleatoria. Otros posibles valores del parámetro son los siguientes: **k-means++** para seleccionar los centroides para que la convergencia sea más rápida; **ndarray** se indica un ndarray de dimensión (n_clusters, n_features) los centroides que se quieren utilizar en el arranque.\n",
"\n",
"2.- **n_init=10**. Número de veces en los que arranca este procedimiento de forma aleatoria para elegir el que menor inercia posee.\n",
"\n",
"3.- **n_clusters=3**. Para indicar el parámetro k que representa el número de cluster's."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En el ejemplo anterior se ha utilizado el parámetro \"init=randon\" y como ya se ha indicado lo que se hace es elegir de forma aleatoria los centroides correspondientes para seguir con el método. Este procedimiento en ocasiones nos puede llevar a una ralentización del proceso o incluso a una falta de convergencia, lo que originaría una pérdida de fiabilidad del modelo.\n",
"\n",
"Para evitar este tipo de situaciones, lo que se puede utilizar es el parámetro init con el valor \"k-means++\", que por regla general obtiene mejores resultados que el sistema usado anteriormente.\n",
"\n",
"Para ver la fiabilidad del método, a continuación se vuelve a generar el gráfico conteniendo los datos iniciales, pero en esta ocasión con indicación del cluster al que pertenece cada punto, indicando para ello un color diferente que identifica la pertenencia a cada uno de los cluster's."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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f97rVUrpfT6lf4nPp4gkoPzUtg16//33sWzZMuzduxdz584FAMydOxd79uzBsmXLcPDgwahjzclRrqFG7xqAYuto9925M7rdk8k4UritXJJIza9//WtUVFRg1qxZ+M53vhPx+sKFC7Fjxw4AwKFDhzBlyhQAwJtvvomqqip4PB5UVFRg3759uOOOO/Duu+/C4/HgRz/6EQDgnnvuwdy5c1FRUYHGke95Bw4cwIUXXohbbrkFF110ET744IOwa86ePTt4HYZJBG1QEwjoN53SI5o/vHGjIpzqplMSraD6fD6sW7cOp5xySth+p556KtatWwefXLE4ytgbGiKf1zbOiravdmm2rMHoLKaZRzJZJXZVvDuxrauayZMnB8eWCJxVkp1o0wFlvvNIO/iYOc1G/tbsrEqMVbYvC23MjNXtwImLBRslkUVJjZBsW9ef/vSn+Ld/+zccPHgwOPGiRt3W9aKLLsKePXuwb98+AIja1pVhkkE9uScnDuUEnpywk5N9ep3y4vnhgL2L4QqhWDLSt/b5wicd1dG0Vd59puC8ftwI/aOoewUn2dUVRMm1da2ursazzz6L2tpaPPzwwzjnnHMizr9q1SrcfPPNYc8fOHAgaltXhkmGaD261RN4QOygR7Z41frhcjtWT28rxFL60wsWhK6xc2eon7Z2VfdYY80mHBdxAyFPW02yd/gvfelL+O1vf4vDhw8DAD777LOIfaZMmYKdI7MfTz31VPD5/fv345xzzoHX68XixYvx+uuv45RTTsHnn38e3Ke2tha/+tWvgrmsH374IT799NPEB8wwBtDr0a2dwIu2cIH6HNptSbyJTiuSCJqawq8hfXW9a8QaazbhOOE2k4dqhhkzZuDOO+/EggULMGvWLDTozIjcfvvt+Pd//3dcfPHFYal569atQ3l5OTweD/bs2YPrr78e48aNwyWXXILy8nL86Ec/wqJFi3DNNdegpqYGM2fOxNKlS8OEPRptbW2YOHEiurq6UFFRgRtvvDGxN8hkJXpBjrZIRft3Y2byXzuxqd62Mokg2so6diUquB6jZriZR7Il79zV1Tw8OZl96LU+lZN80daPNDPJF+vvMBWThdkwIakGrl4seIRMaBqTSli4s5NEskrirSaj3ScdGSdGxpppmBFuQclODeswZ84ckvnQkt27d+PCCy+0/FqMAn++2YvWzggE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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"color=['red','blue','green']\n",
"for i in range(0,3):\n",
" plt.scatter(X[y_km==i,0],\n",
" X[y_km ==i,1],\n",
" c=color[i],\n",
" marker='x',\n",
" label='cluster '+str(i))\n",
"# Coloco los centroides \n",
"plt.scatter(km.cluster_centers_[:,0],\n",
" km.cluster_centers_[:,1],\n",
" s=150,\n",
" marker='*',\n",
" c='black',\n",
" label='centroides')\n",
"plt.legend(loc='lower left') \n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Método elbow\n",
"\n",
"Anteriormente ya se ha comentado que una de las deficiencias importantes de K-means es que hay que definir de forma explícita el valor de k ( número de cluster's). Para evaluar *el mejor k* a utilizar se puede utilizar el método de elbow que a continuación se pasa a exponer.\n",
"\n",
"Como ya se ha dicho anteriormente, k-means lo que pretende es minimizar el valor de SEE definido anteriormente o lo que es lo mismo, minimizar la inercia. Scikip learn tiene una propiedad que permite de una forma cómo calcular ese valor."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Distorsion: 72.48\n"
]
}
],
"source": [
"print('Distorsion: %.2f' % km.inertia_)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Si se va generando el método k-means para distintos valores consecutivos de k y se hace una gráfica de los mismos, se podría cortar en aquel valor de k para el que la gráfica comienza a decrecer más lentamente. Vemos esto para el ejemplo anterior."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"distortions = []\n",
"for i in range(1, 11):\n",
" km = KMeans(n_clusters=i,\n",
" init='k-means++',\n",
" n_init=10,\n",
" max_iter=300,\n",
" random_state=0)\n",
" km.fit(X)\n",
" distortions.append(km.inertia_)\n",
"plt.plot(range(1,11), distortions, marker='o')\n",
"plt.xlabel(\"Numero de cluster's\")\n",
"plt.ylabel('Distorsion')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Como puede verse en el gráfico anterior, para k=3 la gráfica comienza a decrecer mucho más lentamente, y por lo tanto sería k=3 el valor elegido para realizar el análisis clúster en este caso.\n",
"\n",
"# Gráfico silhouette\n",
"\n",
"Otra medida de la calidad del ajuste, nos lo ofrece el indicador denominado silhouette, que además puede ser empleado en otro tipo de algoritmos de tipo cluster.\n",
"\n",
"Los coeficientes de este indicador se calcularían de la siguiente forma:\n",
"\n",
"1.- Se calcularía el valor de \"cluster cohesion\" \\\\( a^{(i)} \\\\) para cada elementos de los datos tratados, como el valor medio de las distancias de un punto a todos los puntos del cluster al que pertenece. \n",
"\n",
"2.- Se calcula el valor \"cluster separación\" \\\\( b^{(i)} \\\\) para cada elemento de los datos tratados, como el valor medio de las distancias de un punto a todos los puntos del cluster más cercano.\n",
"\n",
"3.- Se calcularía el valor de silhouette mediante la siguiente fórmula:\n",
"\n",
"\\\\[ s^{(i)}=\\frac{b^{(i)}-a^{(i)}}{max \\\\{b^{(i)}, a^{(i)} \\\\}} \\\\]\n",
"\n",
"El valor anterior estaría comprendido entre -1 y 1 y lo ideal es que esté lo más cerca posible de 1 y que \\\\( b^{(i)} >> a^{(i)} \\\\)\n",
"\n",
"puesto que \\\\( b^{(i)} \\\\) cuantifica el grado de disimilitud de un punto a otros cluster's y \\\\( a^{(i)} \\\\) mide la similitud de un punto respecto otros elementos del mismo cluster.\n",
"\n",
"El coeficiente silhouette se puede obtener del módulo metric del paquete scikit-learn y además se puede usar silhouette_scores que lo que hace es calcular la media de los coeficientes silhouette, aunque este valor también puede ser calculado con numpy.mean(silhouette_samples(...)) \n",
"\n",
"\n",
"Con la ejecución del siguiente código, se puede calcular el gráfico de estos valores y nos servirá para evaluar la calidad de los cluster's obtenidos."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"km = KMeans(n_clusters=3,\n",
" init='k-means++',\n",
" n_init=10,\n",
" max_iter=300,\n",
" tol=1e-04,\n",
" random_state=0)\n",
"y_km = km.fit_predict(X)\n",
"import numpy as np\n",
"from matplotlib import cm\n",
"from sklearn.metrics import silhouette_samples\n",
"cluster_labels = np.unique(y_km)\n",
"n_clusters = cluster_labels.shape[0]\n",
"silhouette_vals = silhouette_samples(X,\n",
" y_km,\n",
" metric='euclidean')\n",
"y_ax_lower, y_ax_upper = 0, 0\n",
"yticks = []\n",
"for i, c in enumerate(cluster_labels):\n",
" c_silhouette_vals = silhouette_vals[y_km == c]\n",
" c_silhouette_vals.sort()\n",
" y_ax_upper += len(c_silhouette_vals)\n",
" color = cm.jet(i / n_clusters)\n",
" plt.barh(range(y_ax_lower, y_ax_upper),\n",
" c_silhouette_vals,\n",
" height=1.0,\n",
" edgecolor='none',\n",
" color=color)\n",
" yticks.append((y_ax_lower + y_ax_upper) / 2)\n",
" y_ax_lower += len(c_silhouette_vals)\n",
"silhouette_avg = np.mean(silhouette_vals)\n",
"plt.axvline(silhouette_avg,\n",
" color=\"red\",\n",
" linestyle=\"--\")\n",
"plt.yticks(yticks, cluster_labels + 1)\n",
"plt.ylabel('Cluster')\n",
"plt.xlabel('Coeficientes Silhouette')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"De acuerdo con el gráfico anterior, observamos que los valores de Silhouette no tienen valores negativos y además muestra valores altos cercanos a 1, lo que indica una buena calidad de los cluster's encontrados.\n",
"\n",
"Además para incidir aún más sobre la calidad del cluster, se ha dibujada una línea discontinua que indica el valor medio de los valores de silhouette encontrados."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ejemplo de k-means para dígitos\n",
"\n",
"En lo que sigue se comenta el ejemplo de k-means que se puede ver en la documentación de Sklearn, y en concreto en esta dirección: http://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_digits.html#sphx-glr-auto-examples-cluster-plot-kmeans-digits-py.\n",
"\n",
"En este ejemplo también se van a obtener una serie de indicadores de la calidad del cluster obtenido, cuya exposición y detalle se pueden ver en el siguiente enlace: http://scikit-learn.org/stable/modules/clustering.html#clustering-evaluation.\n",
"\n",
"En concreto, los indicadores calculados serán los siguientes:\n",
"\n",
"|nombre corto |\tnombre completo|\n",
"|----------|----------|\n",
"|homo |\thomogeneity score|\n",
"|compl |\tcompleteness score|\n",
"|v-meas |\tV measure|\n",
"|ARI |\tadjusted Rand index|\n",
"|AMI |\tadjusted mutual information|\n",
"|silhouette |\tsilhouette coefficient|\n",
"\n",
"Se va a cargar el ejemplo que tiene el propio Sklearn y se le va a llamar digits. Con el código que sigue se procede a su carga."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Automatically created module for IPython interactive environment\n",
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"D:\\programas\\Anaconda\\lib\\site-packages\\IPython\\core\\magics\\pylab.py:160: UserWarning: pylab import has clobbered these variables: ['yticks']\n",
"`%matplotlib` prevents importing * from pylab and numpy\n",
" \"\\n`%matplotlib` prevents importing * from pylab and numpy\"\n"
]
}
],
"source": [
"print(__doc__)\n",
"%pylab inline\n",
"from time import time\n",
"import numpy as np\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from sklearn import metrics\n",
"from sklearn.cluster import KMeans\n",
"from sklearn.datasets import load_digits\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.preprocessing import scale\n",
"\n",
"np.random.seed(42)\n",
"\n",
"digits = load_digits()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vamos primero a ver cómo está contituido este fichero. Su estructura es de tipo similar a un diccionario (se puede ver si se ejecuta el código python: print(digits)). Con la siguiente instrucción se obtienen las claves de ese diccionario. "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dict_keys(['data', 'target', 'target_names', 'images', 'DESCR'])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"digits.keys()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"Optical Recognition of Handwritten Digits Data Set\\n===================================================\\n\\nNotes\\n-----\\nData Set Characteristics:\\n :Number of Instances: 5620\\n :Number of Attributes: 64\\n :Attribute Information: 8x8 image of integer pixels in the range 0..16.\\n :Missing Attribute Values: None\\n :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr)\\n :Date: July; 1998\\n\\nThis is a copy of the test set of the UCI ML hand-written digits datasets\\nhttp://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits\\n\\nThe data set contains images of hand-written digits: 10 classes where\\neach class refers to a digit.\\n\\nPreprocessing programs made available by NIST were used to extract\\nnormalized bitmaps of handwritten digits from a preprinted form. From a\\ntotal of 43 people, 30 contributed to the training set and different 13\\nto the test set. 32x32 bitmaps are divided into nonoverlapping blocks of\\n4x4 and the number of on pixels are counted in each block. This generates\\nan input matrix of 8x8 where each element is an integer in the range\\n0..16. This reduces dimensionality and gives invariance to small\\ndistortions.\\n\\nFor info on NIST preprocessing routines, see M. D. Garris, J. L. Blue, G.\\nT. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C.\\nL. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469,\\n1994.\\n\\nReferences\\n----------\\n - C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their\\n Applications to Handwritten Digit Recognition, MSc Thesis, Institute of\\n Graduate Studies in Science and Engineering, Bogazici University.\\n - E. Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika.\\n - Ken Tang and Ponnuthurai N. Suganthan and Xi Yao and A. Kai Qin.\\n Linear dimensionalityreduction using relevance weighted LDA. School of\\n Electrical and Electronic Engineering Nanyang Technological University.\\n 2005.\\n - Claudio Gentile. A New Approximate Maximal Margin Classification\\n Algorithm. NIPS. 2000.\\n\""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Veamos la descripción que tiene el propio fichero\n",
"digits.DESCR"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dimensiones de digits.data: (1797, 64)\n",
"Dimensiones de digits.target (1797,)\n",
"Dimensiones de digits.images (1797, 8, 8)\n",
"Algunos valores de target: [0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 9 5 5 6 5 0\n",
" 9 8 9]\n"
]
}
],
"source": [
"#Algunos detalles del fichero de trabajo\n",
"print(\"Dimensiones de digits.data: \" ,digits.data.shape)\n",
"print(\"Dimensiones de digits.target\" , digits.target.shape)\n",
"print(\"Dimensiones de digits.images\" ,digits.images.shape)\n",
"print(\"Algunos valores de target: \", digits.target[0:40])\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Se pueden ver que tenemos 1797 imágenes de los dígitos del 0 al 9. Estas imágenes son arrays de tamaño 8x8 bits. Los datos con los que se va a trabajar ( digits.data) son esos arrays de imágenes pero puestos todos sus valores en una sola fila. Por ese motivo en digits.data tenemo 1797 observaciones y 64 features o columnas (=8x8)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lo primero que se hace es estandarizar los datos (ojo,los de digits.data) con la función scale (http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html#sklearn.preprocessing.scale). Como en este ejemplo, no se determina ningún valor para el parámetro axis, se tomaría cero que es el valor por defecto, y por lo tanto la estandarización sería a nivel de \"features\"."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"data = scale(digits.data)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Media de features: 0.00000, Sd de features: 0.97628\n"
]
}
],
"source": [
"#Comprobamos que la media y desviación típica por columnas es cero y uno respectivamente\n",
"print(\"Media de features: %6.5f, Sd de features: %6.5f\" % (np.mean(data),np.std(data))) \n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Número de muestras: 1797, número de features: 64\n",
"Número de dígitos: 10\n",
"Otra forma de calcular el número de dígitos: 10\n",
"Unos cuantos target: [0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9] ....tener en cuenta que estos \"labels\" después van a servir para calcular la bondad del modelo \n"
]
}
],
"source": [
"n_samples, n_features = data.shape\n",
"print(\"Número de muestras: %d, número de features: %d\" % (n_samples,n_features))\n",
"n_digits = len(np.unique(digits.target))\n",
"print(\"Número de dígitos: %d\" %(n_digits))\n",
"print(\"Otra forma de calcular el número de dígitos: %d\" % (len(digits.target_names)))\n",
"labels = digits.target\n",
"print(\"Unos cuantos target: \", labels[0:30],\"....tener en cuenta que estos \\\"labels\\\" después van a servir para calcular la bondad del modelo \")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A continuiación se muestran una visualización de los números."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAbcAAADRCAYAAABPTfwYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAEcpJREFUeJzt3XuQlfV9x/HPV0jGSDxoEVrDgsp4YwGN1jGLIqMoi4ASo1BvxCrWWyURqonxMjh01JQ2KtVGrAhS6zVuNKOR6tJRqyjQxluQBY21COulLFp3MY0lyK9/7GbGdjJ+f7DP8pzz5f2aYQT88Hu+Pp49H87Z83seSykJAIBIdil7AAAAika5AQDCodwAAOFQbgCAcCg3AEA4lBsAIJxCys3MTjSzN8zsLTP7QRFrQjKzhWa2wcxeL3uWSMxskJk9Y2arzWyVmV1W9kxRmNmuZvavZvZa17mdXfZMkZhZLzN7xcx+XvYs1a7b5WZmvST9WNJ4SfWSzjSz+u6uC0nSIkknlj1EQFskXZ5SGiqpQdKlPGYL8z+SxqSUDpX0dUknmllDyTNFcpmk1WUPUQuKeOV2pKS3Ukpvp5Q2S3pQ0jcLWHenl1J6TtJHZc8RTUrp/ZTSy10/36TOJ4uB5U4VQ+r0Sdcvv9T1gytFFMDM6iRNlHRX2bPUgiLKbaCk9Z/7dat4okCNMLN9JR0maUW5k8TR9dbZq5I2SFqSUuLcFmOupO9L2lr2ILWgiHKz3/N7/E0NVc/Mvirpp5JmpJQ6yp4nipTSZymlr0uqk3SkmQ0ve6ZaZ2YnSdqQUnqp7FlqRRHl1ipp0Od+XSfpvQLWBXqMmX1JncV2X0rpkbLniSil9LGkZ8X3jYtwtKRJZrZWnd/6GWNm95Y7UnUrotz+TdIBZrafmX1Z0hmSHitgXaBHmJlJWiBpdUrp5rLnicTM+pvZHl0//4qkEyStKXeq2pdSuiqlVJdS2ledz7FPp5SmljxWVet2uaWUtkiaLukpdX5j/icppVXdXReSmT0gaZmkg8ys1czOL3umII6W9G11/u331a4fE8oeKoi9JT1jZr9U5198l6SU+Ng6djjjljcAgGi4QgkAIBzKDQAQDuUGAAin97aEzayQb9BVKnu5mbp99nYzH7d/4mYk6YPW9W5m69YtWWt5Ukq/b9/fFyrqvOYYcvDBbqZ3r15Za72/7gM3s2nTh1lrebbnvEo79tz26dPXzex/wH5Za2369FM38/aaYj6EWOZjtv8A/3oPgwf9kZv5zebNWcdbs8q/clVRzwWSNqaU+m/rH9qRj9lddvG/1gcNGZK11jtv/aq742TLecxuU7kVZdSo09zMjfOudjNPPLk063hzvudfF7ejY2PWWrXuxrvvdjMDKpWstX4442/czJIli7LWimDE8NFu5rHmvK1JT7e0uJkzRo7MWquanXbWdDcz7xb/WuyvrVuXdbzRI/7YzRT4XPBOUQv1lK/22cPNXPO3f5e11oUTx3V3nELxtiQAIBzKDQAQDuUGAAiHcgMAhEO5AQDCodwAAOFQbgCAcErZ55azh+3QwYPdzNK9/E2zktTe3uZmJk682M0sXvz3WcerZh0f+ffkPL2hIWutZ8cf42ai7HOrH3qUm1m23L/TU1tH3j1Rh9fVZeWq2ZU33O5mzpw60c2c9W3/+eL+f7wxa6YRI/y9iC+8sPPc3m/y2d91My0v+nsuqxGv3AAA4VBuAIBwKDcAQDiUGwAgHMoNABAO5QYACIdyAwCEQ7kBAMIpfBP38IwbNuZs0B48uN7NrF/v31VXkvo+97ybGXH0oW5m8eKsw5UmZ6PxKaPyNmjnqNXNnduj8dQpbuaZjBuMPnZ/c9bxbrl+Rlaumt1/x21uZt6cWW7muZUvuZncm5XuTBu0K7v3czNTvzPZzdx+3cKs49UNPDAr52l9981C1uGVGwAgHMoNABAO5QYACIdyAwCEQ7kBAMKh3AAA4VBuAIBwKDcAQDiFb+Lu23cvN9O8cqWbyd2gneP15/3jVbtpF892M381x9/4279SKWIcSdLyZY8Xtla1W3jr9W6m9Y1WN3P7An/TsiTNX5y32bua5XwNDxo01M3kXPTh3ueXZs1UqfjPTx0dG7PWqnY5d9nOueN7U9NNWcebdfMCN9PxoX8n+rk3zMw6nodXbgCAcCg3AEA4lBsAIBzKDQAQDuUGAAiHcgMAhEO5AQDCodwAAOH0wCbu/m7m6cfzNlwWpbJXXzfTsbF9B0yy/RbecZ2babrvVjfTXuAG1ZwNsSrorro9KeeOxdO+e62bmXRWYxHjSJKuOOOswtaqZjkbvXOeUx5e+nTW8XJyU0aNcTNlb/QeO/ZcN7Ngnn/BgJvuaSpgmk6zZ05zM1OmXFHY8Ty8cgMAhEO5AQDCodwAAOFQbgCAcCg3AEA4lBsAIBzKDQAQDuUGAAiHcgMAhFP4FUra29vczPBjRhRyrKwrZEg6YqR/vEcXPtHdcXY69cNGupmW1S/ugEm6Z8bsv3YzOVdfyNHYeF5WrmPTh4UcL4Kcq4HkXFVEkm68e5GbueTKv3Qzc67586zj9ZRNHf7jo62jw81cfs5kN3P4EauyZsrR/NSiwtby8MoNABAO5QYACIdyAwCEQ7kBAMKh3AAA4VBuAIBwKDcAQDiUGwAgnMI3ca9b5982/oRD/E3VEyZc5GfOPzlrphx3zL2qsLVQW5rmL3Azx45rcDPH1de7mebmu7Nmmr/4TDfz8NwH3MySJYuyjleWK2+43c0sXfzPbqZv3/5Zxzvt+FFuZuHG6r+gw/IVj7uZAX37upn6oUe5mWeX/1PWTDfd0+RmduTFCXjlBgAIh3IDAIRDuQEAwqHcAADhUG4AgHAoNwBAOJQbACAcyg0AEE7hm7jXr/c3cf/F9Dlu5sZ5V7uZpb9YmTXTuEMOycrVupwNkvMXN7uZCyY0Zh2v4WR/Y3OTv6+zdDl3Cx8zbJibydkQO+NH12XNlPP/oPWNVjdT7Zu429va3cyP77+lsOMtfMjfoH3NRWcXdrxql3OX8/6VStZaTbff091xCsUrNwBAOJQbACAcyg0AEA7lBgAIh3IDAIRDuQEAwqHcAADhUG4AgHAspZQfNmuT9E7PjVPz9kkp5d0S+HM4r67tOq8S5zYDj9mew7ntGVnndZvKDQCAWsDbkgCAcCg3AEA4lBsAIBzKDQAQDuUGAAiHcgMAhEO5AQDCodwAAOFQbgCAcCg3AEA4lBsAIBzKDQAQDuUGAAiHcgMAhEO5AQDCodwAAOFQbgCAcCg3AEA4lBsAIBzKDQAQTiHlZmZrzWylmb1qZr8oYk10MrM9zKzJzNaY2WozG1n2TLXOzA7qeqz+7keHmc0oe64ozGymma0ys9fN7AEz27XsmSIws8u6zukqHq8+Syl1fxGztZKOSClt7PZi+D/M7B8kPZ9SusvMvixpt5TSx2XPFYWZ9ZL0rqRvpJTeKXueWmdmAyUtlVSfUvqNmf1E0uKU0qJyJ6ttZjZc0oOSjpS0WdKTki5JKf2q1MGqGG9LVjEzq0gaLWmBJKWUNlNshTte0r9TbIXqLekrZtZb0m6S3it5ngiGSlqeUvrvlNIWSf8i6Vslz1TViiq3JKnZzF4yswsLWhPSEEltku42s1fM7C4z61P2UMGcIemBsoeIIqX0rqQfSVon6X1J7Sml5nKnCuF1SaPNrJ+Z7SZpgqRBJc9U1Yoqt6NTSodLGi/pUjMbXdC6O7vekg6XNC+ldJikX0v6QbkjxdH1Nu8kSQ+XPUsUZranpG9K2k/S1yT1MbOp5U5V+1JKqyXNkbREnW9JviZpS6lDVblCyi2l9F7XPzdIelSd7wuj+1oltaaUVnT9ukmdZYdijJf0ckrpP8seJJATJP1HSqktpfRbSY9IOqrkmUJIKS1IKR2eUhot6SNJfL/tC3S73Mysj5nt/rufS2pU50todFNK6QNJ683soK7fOl5SS4kjRXOmeEuyaOskNZjZbmZm6nzMri55phDMbEDXPwdLOlU8dr9Q7wLW+ENJj3Y+jtVb0v0ppScLWBedviPpvq630N6WdF7J84TQ9X2LsZIuKnuWSFJKK8ysSdLL6nzb7BVJd5Y7VRg/NbN+kn4r6dKU0n+VPVA1K2QrAAAA1YStAACAcCg3AEA4lBsAIJxt+kCJmRXyDbohBx/sZjZ/utnNtK59u4hxCpVSsm39M0Wd1xw55753r15Za725alV3x8m2PedVKu7c9uv/NTfTq5f/d8U9+vXNOt7uu/qXY9zy2WduZuUvV37hv9+6datS2lraY3bvun3czJ57VtzMxra8z1Zs3PC+m9m61T+vmTamlPpv6x8q6tzus/8BbqZXb/9r/e01a4oYp1A5zwfb9IGSok76g8uWuZnWN1vdzBV/OqWIcQpV7eWWc+4HVPwnE0kaM2xYd8fJVna5Tbt4tpup9PPP26SzGrOOd1x9vZtp6+hwM/vXDfnCf//Jrz/WZ59tKe0xO+vmBW7mT6b45+yuO5qyjrfw1uvdTMemD7PWyvBSSumIbf1DRZ3bO594ys1U/sB/zJ4xsvqu1Z7zfMDbkgCAcCg3AEA4lBsAIBzKDQAQDuUGAAiHcgMAhFPEhZO32fC6OjdzekODm7n8nLxPzK5q9bcVDB9U+/f9Gzv2XDeTc15nXju3gGl2Ph0f+h/Nv3pa3u34ps2a7mZyPsZd4Mfae0T9SH/LQ44/u3hyVq7hJP/xX40fff//6gYe6GYumJC37cRzeuZ2sWda/BuW7MjtQ7xyAwCEQ7kBAMKh3AAA4VBuAIBwKDcAQDiUGwAgHMoNABAO5QYACKeUTdwbMu5DlbPVL+d+VpL05NPL3Uxl935upto3xF4193uFrNP8yMOFrBPJwjuuK2SdGdfckpXbf1//QgenNIzu7jila1nmb/xt7VfcvR03tLe7mYZvnOxmlq94POt4PaVS2auQdR5a7j835txbU5JOHONvkN+ReOUGAAiHcgMAhEO5AQDCodwAAOFQbgCAcCg3AEA4lBsAIBzKDQAQTimbuN9a628KPK7ev0Nv/4p/J2Ipb6NotW/QzjEg43zk3C23ZfWLRYxTM3I27TacMKaQY139/WmFrCNJjePOdTNNTTcVdrye0DR/gZtZ1fKCm6k7cFnW8XIuINHa+kbWWmUqasYLG09yM3c2/zxrrZznnx2JV24AgHAoNwBAOJQbACAcyg0AEA7lBgAIh3IDAIRDuQEAwqHcAADhlLKJ+8KJ49zMwoyNtfWHHZF1vAXzZmXlPEXdjbmn5GyifL3V30A/7eLZWcdrfvw+N9P67ptZa5UpZ0Ns/VHT3cwpo4q7E/Gkxqlupuy7QRehUulXyDqnN+Sd+0F1B7mZWnjM5lx0IueCDe0dG93MdbcszJppTMaFN+oGHuhmijr/vHIDAIRDuQEAwqHcAADhUG4AgHAoNwBAOJQbACAcyg0AEA7lBgAIh3IDAIRTyhVKcuzoqy/UHVi3Q4/XE3KuPpJzJYfc28XnXPllWP3RbqZl9YtZx+spOVdEyLmqzgUpuZnGxvOyZopw9ZH6oUe5mWXLH3MzM6+d62Zyv37vaX7UzZzT+C03UwtXMRkzbJibyfl/VOTX56w7b3MzOV9rOXjlBgAIh3IDAIRDuQEAwqHcAADhUG4AgHAoNwBAOJQbACAcyg0AEE4pm7jHjj3XzWzq8G+jPmPu1QVM06n5oZ8VtlZZ7r2tyc0cl7Hx+q21/mZwSRpe52+cbTx1iptpuaHcTdw5Zt28wM20dXS4mRXLa39zdq7W1jfcTM45W3jr9W6mru6grJkub3nBzUw+9xI3M/eGmVnHq3Y5G7RzHvuSNP38yW5mUuPUrLWKwCs3AEA4lBsAIBzKDQAQDuUGAAiHcgMAhEO5AQDCodwAAOFQbgCAcErZxD1y/DFuZvbMaYUd76Z7/M3NEe583HTfrW4m547FOZsxJelnS5e7meZHHs5aq9odO86/g/nZky9zMx2b/IsTRJHz35rzGGrv2OhmcjaDS9L8xc1uJmfTeC3I2XxdP7LezQyoVLKOd2zDeDdT5F29PbxyAwCEQ7kBAMKh3AAA4VBuAIBwKDcAQDiUGwAgHMoNABAO5QYACMdSSvlhszZJ7/TcODVvn5RS/239Q5xX13adV4lzm4HHbM/h3PaMrPO6TeUGAEAt4G1JAEA4lBsAIBzKDQAQDuUGAAiHcgMAhEO5AQDCodwAAOFQbgCAcCg3AEA4/wtgWmABCNB2SgAAAABJRU5ErkJggg==\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"n_row, n_col = 2, 5\n",
"\n",
"def print_digits(images, y, max_n=10):\n",
" # set up the figure size in inches\n",
" #fig = plt.figure(figsize=(2. * n_col, 2.26 * n_row))\n",
" fig = plt.figure(figsize=(1.5*n_col,1.8*n_row))\n",
" i=0\n",
" while i < max_n and i < images.shape[0]:\n",
" p = fig.add_subplot(n_row, n_col, i + 1, xticks=[], yticks=[])\n",
" p.imshow(images[i], cmap=plt.cm.bone, interpolation='nearest')\n",
" # label the image with the target value\n",
" p.text(0, -1, str(y[i]))\n",
" i = i + 1\n",
" \n",
" \n",
"print_digits(digits.images, digits.target, max_n=10)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A continuación creo la estructura para presentar los resultados de la bondad del método k-means. También se presentan los datos para dos valores del parámetro \"init\", del método de k-means"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"n_digits: 10, \t n_samples 1797, \t n_features 64\n",
"__________________________________________________________________________________\n",
"init\t\ttime\tinertia\thomo\tcompl\tv-meas\tARI\tAMI\tsilhouette\n",
"k-means++\t0.29s\t69432\t0.602\t0.650\t0.625\t0.465\t0.598\t0.146\n",
"random \t0.24s\t69694\t0.669\t0.710\t0.689\t0.553\t0.666\t0.147\n"
]
}
],
"source": [
"sample_size = 300\n",
"\n",
"print(\"n_digits: %d, \\t n_samples %d, \\t n_features %d\"\n",
" % (n_digits, n_samples, n_features))\n",
"\n",
"\n",
"print(82 * '_') #Con esto se crea una línea\n",
"print('init\\t\\ttime\\tinertia\\thomo\\tcompl\\tv-meas\\tARI\\tAMI\\tsilhouette')\n",
"#Con esto crea la cabecera de la tabla\n",
"\n",
"def bench_k_means(estimator, name, data): #Un función para generar los resultados\n",
" t0 = time()\n",
" estimator.fit(data)\n",
" #\"estimator.labels\" va a ser el cluster al que se asigna cada uno de los puntos del data\n",
" print('%-9s\\t%.2fs\\t%i\\t%.3f\\t%.3f\\t%.3f\\t%.3f\\t%.3f\\t%.3f'\n",
" % (name, (time() - t0), estimator.inertia_,\n",
" metrics.homogeneity_score(labels, estimator.labels_),\n",
" metrics.completeness_score(labels, estimator.labels_),\n",
" metrics.v_measure_score(labels, estimator.labels_),\n",
" metrics.adjusted_rand_score(labels, estimator.labels_),\n",
" metrics.adjusted_mutual_info_score(labels, estimator.labels_),\n",
" metrics.silhouette_score(data, estimator.labels_,\n",
" metric='euclidean',\n",
" sample_size=sample_size)))\n",
"\n",
"bench_k_means(KMeans(init='k-means++', n_clusters=n_digits, n_init=10),\n",
" name=\"k-means++\", data=data)\n",
"\n",
"bench_k_means(KMeans(init='random', n_clusters=n_digits, n_init=10),\n",
" name=\"random\", data=data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A continuación se muestran la etiquetas que genera este procedimiento K-Means"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 3, 2, 9, 4, 9, 0, 8, 9, 9, 1, 2, 6, 9, 4, 7, 0, 8, 3, 9, 1, 2,\n",
" 3, 9, 2, 3, 0, 2, 3, 9, 1, 9, 7, 7, 0, 7, 1, 9, 3, 9, 3, 4, 2, 8,\n",
" 8, 9, 3, 2, 1, 1])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"esti=KMeans(init='k-means++', n_clusters=n_digits, n_init=10).fit(data)\n",
"esti.labels_[0:50]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A continuación vamos a ejecutar un análisis de componentes principales. Podemos observar que el tiempo empleado se reduce muy sustancialmente, simplemente observando la columna \"time\". La razón de esto último es debido a que al parámetro \"init\" le pasamos un array (los ejes factoriales obtenidos en PCA) de dimensión n_clusters * n_features.Gracias a esto podemos poner el parámetro n_init=1 y así no hay que repetir el procedimiento para ajustar los centroides, estos centroides nos lo da el valor del parámetro \"init\"."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"n_digits: 10, \t n_samples 1797, \t n_features 64\n",
"__________________________________________________________________________________\n",
"init\t\ttime\tinertia\thomo\tcompl\tv-meas\tARI\tAMI\tsilhouette\n",
"k-means++\t0.27s\t69490\t0.609\t0.656\t0.631\t0.476\t0.605\t0.144\n",
"random \t0.23s\t69425\t0.602\t0.651\t0.626\t0.466\t0.598\t0.138\n",
"PCA-based\t0.03s\t70803\t0.670\t0.697\t0.683\t0.561\t0.667\t0.137\n",
"__________________________________________________________________________________\n"
]
}
],
"source": [
"print(\"n_digits: %d, \\t n_samples %d, \\t n_features %d\"\n",
" % (n_digits, n_samples, n_features))\n",
"\n",
"\n",
"print(82 * '_')\n",
"print('init\\t\\ttime\\tinertia\\thomo\\tcompl\\tv-meas\\tARI\\tAMI\\tsilhouette')\n",
"bench_k_means(KMeans(init='k-means++', n_clusters=n_digits, n_init=10),\n",
" name=\"k-means++\", data=data)\n",
"\n",
"bench_k_means(KMeans(init='random', n_clusters=n_digits, n_init=10),\n",
" name=\"random\", data=data)\n",
"\n",
"# in this case the seeding of the centers is deterministic, hence we run the\n",
"# kmeans algorithm only once with n_init=1\n",
"pca = PCA(n_components=n_digits).fit(data) \n",
"#Con pca.components_ calculamos las puntuaciones factoriales sobre los 10 primeros factores\n",
"bench_k_means(KMeans(init=pca.components_, n_clusters=n_digits, n_init=1),\n",
" name=\"PCA-based\",\n",
" data=data)\n",
"print(82 * '_')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Veamos el tamaño de los componentes del PCA. Observar que es igual a n_clusters * n_features"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(10, 64)\n"
]
}
],
"source": [
"a=pca.components_\n",
"print(a.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A continuación realizamos un PCA y nos quedamos con los dos primeros componentes. Sobre esos dos ejes factoriales se obtienen las puntuaciones de todas las observaciones"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1797, 2)\n"
]
}
],
"source": [
"reduced_data = PCA(n_components=2).fit_transform(data)\n",
"print(reduced_data.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#Sobre los datos anteriores hacemos un kmeans"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,\n",
" n_clusters=10, n_init=10, n_jobs=1, precompute_distances='auto',\n",
" random_state=None, tol=0.0001, verbose=0)"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"kmeans = KMeans(init='k-means++', n_clusters=n_digits, n_init=10)\n",
"kmeans.fit(reduced_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"procedemos a la representación de los datos. A continuación se hacen los preparativos"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"# Step size of the mesh. Decrease to increase the quality of the VQ.\n",
"h = .02 # point in the mesh [x_min, x_max]x[y_min, y_max].\n",
"\n",
"# Plot the decision boundary. For that, we will assign a color to each\n",
"x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1\n",
"y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1\n",
"xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
"\n",
"# Obtain labels for each point in mesh. Use last trained model.\n",
"Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])\n",
"# de esta manera obtenemos la predicción para cada uno de los puntos de la malla\n",
"\n",
"# Put the result into a color plot\n",
"Z = Z.reshape(xx.shape)\n",
"#Con esto tenemos la predicción en cada uno de los puntos de la malla"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(927, 949)\n",
"(927, 949)\n",
"(879723,)\n",
"(879723,)\n",
"(879723, 2)\n"
]
}
],
"source": [
"print(xx.shape)\n",
"print(yy.shape)\n",
"print(xx.ravel().shape)\n",
"print(yy.ravel().shape)\n",
"print(np.c_[xx.ravel(), yy.ravel()].shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En el código anterior se han utilizado las propiedades \"ravel\" y \"np.c_\" de numpy, vemos loa que significa.\n",
"\n",
"Empecemos por ** ravel ** . Lo que hace es poner todos los elemento de una matriz en una sola fila (por eso xx.ravel tiene dimensión 879723=927*949). Veamos un ejemplo."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"a= [[1 2]\n",
" [3 4]]\n",
"a.ravel= [1 2 3 4]\n"
]
}
],
"source": [
"a=np.array([[1,2],[3,4]])\n",
"print(\"a= \",a)\n",
"print(\"a.ravel= \",a.ravel())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Veamos con un ejemplo lo que hace np.c_. El ejemplo es lo suficientemente ilustrativo como para no necesitar mayor explicación "
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"a= [1 2 3]\n",
"b= [4 5 6]\n",
"c= [[1 4]\n",
" [2 5]\n",
" [3 6]]\n"
]
}
],
"source": [
"a=np.array([1,2,3])\n",
"print(\"a= \",a)\n",
"b=np.array([4,5,6])\n",
"print(\"b= \",b)\n",
"c=np.c_[a,b]\n",
"print(\"c= \",c)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ahora ya comenzamos a hacer las figuras. Primero ponemos la base de las mismas"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(1)\n",
"#Con lo anterior definimos el contendor de las fiiguras\n",
"plt.clf()\n",
"#Con esto aclaramos la figuira, si es que contiene algo."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(Z, interpolation='nearest',\n",
" extent=(xx.min(), xx.max(), yy.min(), yy.max()),\n",
" cmap=plt.cm.Paired,\n",
" aspect='auto', origin='lower')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"El método \"imshow\" de matplotib se puede ver en el siguiente enlace https://matplotlib.org/api/_as_gen/matplotlib.pyplot.imshow.html. Aquí se utiliza para definir las areas de los 10 clúster's"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(reduced_data[:, 0], reduced_data[:, 1], 'k.', markersize=2)\n",
"#Aquí sacaríamos los puntos sobre los que se ha hecho el kmeans"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Aquí sacariamos los centroides. Aquí de de rojo, pero en el gráfico final irán \n",
"#en blanco para tener el contraste necesario.\n",
"centroids = kmeans.cluster_centers_\n",
"plt.scatter(centroids[:, 0], centroids[:, 1],\n",
" marker='x', s=169, linewidths=3,\n",
" color='r', zorder=10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Juntando todo lo anterior, el gráfico final sería el siguiente:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# #############################################################################\n",
"# Visualize the results on PCA-reduced data\n",
"\n",
"reduced_data = PCA(n_components=2).fit_transform(data)\n",
"kmeans = KMeans(init='k-means++', n_clusters=n_digits, n_init=10)\n",
"kmeans.fit(reduced_data)\n",
"\n",
"# Step size of the mesh. Decrease to increase the quality of the VQ.\n",
"h = .02 # point in the mesh [x_min, x_max]x[y_min, y_max].\n",
"\n",
"# Plot the decision boundary. For that, we will assign a color to each\n",
"x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1\n",
"y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1\n",
"xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
"\n",
"# Obtain labels for each point in mesh. Use last trained model.\n",
"Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])\n",
"\n",
"# Put the result into a color plot\n",
"Z = Z.reshape(xx.shape)\n",
"plt.figure(1)\n",
"plt.clf()\n",
"plt.imshow(Z, interpolation='nearest',\n",
" extent=(xx.min(), xx.max(), yy.min(), yy.max()),\n",
" cmap=plt.cm.Paired,\n",
" aspect='auto', origin='lower')\n",
"\n",
"plt.plot(reduced_data[:, 0], reduced_data[:, 1], 'k.', markersize=2)\n",
"# Plot the centroids as a white X\n",
"centroids = kmeans.cluster_centers_\n",
"plt.scatter(centroids[:, 0], centroids[:, 1],\n",
" marker='x', s=169, linewidths=3,\n",
" color='w', zorder=10)\n",
"plt.title('K-means clustering on the digits dataset (PCA-reduced data)\\n'\n",
" 'Centroids are marked with white cross')\n",
"plt.xlim(x_min, x_max)\n",
"plt.ylim(y_min, y_max)\n",
"plt.xticks(())\n",
"plt.yticks(())\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Cluster Jerárquico\n",
"\n",
"En este apartado, procedo a presentar otro de tipo de agrupación de los datos mediante un sistema jerárquico de agrupación de los datos. Esta representación jerárquica se realiza mediante los **denominados dendogramas** que no son más que representaciones de cómo se van agrupando los datos. Otra característica de estos sistema, es que no se necesita con carácter previo determinar el número k de clústers a utilizar. \n",
"\n",
"Para realizar este tipo de agrupaciones, se seguirán los pasos siguientes:\n",
"\n",
"1.- Calcular la matriz de distancia entre todas las muestras.\n",
"\n",
"2.- Comenzar Representando cada punto como un clúster simple.\n",
"\n",
"3.- Agrupar los dos cluster más similares en base a la métrica utilizada.\n",
"\n",
"4.- Actualizar la matriz de distancias\n",
"\n",
"5.- Repetir los pasos del 2 al 4 hasta que quede un solo clúster\n",
"\n",
"Vamos a continuación a ver cómo se implementan estos pasos. Primero vamos a calcular la matriz de distancias de una serie de números aleatorios que vamos a generar para utilizarlos en el ejemplo."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
X
\n",
"
Y
\n",
"
Z
\n",
"
\n",
" \n",
" \n",
"
\n",
"
ID_0
\n",
"
6.964692
\n",
"
2.861393
\n",
"
2.268515
\n",
"
\n",
"
\n",
"
ID_1
\n",
"
5.513148
\n",
"
7.194690
\n",
"
4.231065
\n",
"
\n",
"
\n",
"
ID_2
\n",
"
9.807642
\n",
"
6.848297
\n",
"
4.809319
\n",
"
\n",
"
\n",
"
ID_3
\n",
"
3.921175
\n",
"
3.431780
\n",
"
7.290497
\n",
"
\n",
"
\n",
"
ID_4
\n",
"
4.385722
\n",
"
0.596779
\n",
"
3.980443
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" X Y Z\n",
"ID_0 6.964692 2.861393 2.268515\n",
"ID_1 5.513148 7.194690 4.231065\n",
"ID_2 9.807642 6.848297 4.809319\n",
"ID_3 3.921175 3.431780 7.290497\n",
"ID_4 4.385722 0.596779 3.980443"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"np.random.seed(123)\n",
"variables = ['X', 'Y', 'Z']\n",
"labels = ['ID_0','ID_1','ID_2','ID_3','ID_4']\n",
"X = np.random.random_sample([5,3])*10\n",
"df = pd.DataFrame(X, columns=variables, index=labels)\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En el anterior ejemplo, se ha construido un dataframe de pandas donde las filas están identificadas como ID_0...ID_4 y las columnas serían las features que se las denomina X, Y, Z.\n",
"\n",
"Como ya se ha dicho anteriormente para estos procesos, se necesita igualmente una matriz de distancias entre las diversas features con las que se trabaja, en nuestro caso, el resultado final sería una matriz de tamaño 3x3, y para las distancias se utilizará el módulo scipy.spatial.distance de scipy."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
ID_0
\n",
"
ID_1
\n",
"
ID_2
\n",
"
ID_3
\n",
"
ID_4
\n",
"
\n",
" \n",
" \n",
"
\n",
"
ID_0
\n",
"
0.000000
\n",
"
4.973534
\n",
"
5.516653
\n",
"
5.899885
\n",
"
3.835396
\n",
"
\n",
"
\n",
"
ID_1
\n",
"
4.973534
\n",
"
0.000000
\n",
"
4.347073
\n",
"
5.104311
\n",
"
6.698233
\n",
"
\n",
"
\n",
"
ID_2
\n",
"
5.516653
\n",
"
4.347073
\n",
"
0.000000
\n",
"
7.244262
\n",
"
8.316594
\n",
"
\n",
"
\n",
"
ID_3
\n",
"
5.899885
\n",
"
5.104311
\n",
"
7.244262
\n",
"
0.000000
\n",
"
4.382864
\n",
"
\n",
"
\n",
"
ID_4
\n",
"
3.835396
\n",
"
6.698233
\n",
"
8.316594
\n",
"
4.382864
\n",
"
0.000000
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" ID_0 ID_1 ID_2 ID_3 ID_4\n",
"ID_0 0.000000 4.973534 5.516653 5.899885 3.835396\n",
"ID_1 4.973534 0.000000 4.347073 5.104311 6.698233\n",
"ID_2 5.516653 4.347073 0.000000 7.244262 8.316594\n",
"ID_3 5.899885 5.104311 7.244262 0.000000 4.382864\n",
"ID_4 3.835396 6.698233 8.316594 4.382864 0.000000"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from scipy.spatial.distance import pdist, squareform\n",
"# squareform crea una matriz simétrica de distancias entre features\n",
"distancias = pd.DataFrame(squareform(\n",
" pdist(df, metric='euclidean')),\n",
" columns=labels, index=labels)\n",
"distancias"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Una vez obtenidas las distancias entre las features usaremos el módulo *scipy.cluster.hierarchy* para generar el clúster."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"from scipy.cluster.hierarchy import linkage\n",
"# Observar que de esta forma tampoco es necesario el cálculo\n",
"# de las distancias con carácter previo\n",
"clusters = linkage(pdist(df, metric='euclidean'),\n",
" method='complete')"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy.cluster.hierarchy import dendrogram\n",
"row_dendr = dendrogram(clusters,\n",
" labels=labels,\n",
" # make dendrogram black (part 2/2)\n",
" # color_threshold=np.inf\n",
" )\n",
"plt.tight_layout()\n",
"plt.ylabel('Distancia Euclídea')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Desde scikip-learn, este cluster también se podría crear de la siguiente manera"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Asignación Cluster : [0 1 1 0 0]\n"
]
}
],
"source": [
"from sklearn.cluster import AgglomerativeClustering\n",
"ac = AgglomerativeClustering(n_clusters=2,\n",
" affinity='euclidean',\n",
" linkage='complete')\n",
"labels = ac.fit_predict(X)\n",
"print('Asignación Cluster : %s' % labels)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Cluster con DBSCAN\n",
"\n",
"Los dos procedimientos de generación de cluster's vistos anteriormente no cubren todas las necesidades en base a la distribución que presentan los puntos que se están estudiando. En este apartado se presentará otro método para crear otro tipo de clúster, en concreto el método DBSCAN. Para presentar el método se generarán una serie de puntos de la siguiente manera.\n"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.datasets import make_moons\n",
"X, y = make_moons(n_samples=200,\n",
" noise=0.05,\n",
" random_state=0)\n",
"plt.scatter(X[:,0], X[:,1])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Observemos los resultados que se obtendrían con los dos métodos anteriores"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"f, (ax1, ax2) = plt.subplots(1, 2, figsize=(8,3))\n",
"km = KMeans(n_clusters=2,\n",
" random_state=0)\n",
"y_km = km.fit_predict(X)\n",
"\n",
"ax1.scatter(X[y_km==0,0],\n",
" X[y_km==0,1],\n",
" c='lightblue',\n",
" marker='o',\n",
" s=40,\n",
" label='cluster 1')\n",
"ax1.scatter(X[y_km==1,0],\n",
" X[y_km==1,1],\n",
" c='red',\n",
" marker='s',\n",
" s=40,\n",
" label='cluster 2')\n",
"ax1.set_title('Cluster K-means ')\n",
"ac = AgglomerativeClustering(n_clusters=2,\n",
" affinity='euclidean',\n",
" linkage='complete')\n",
"y_ac = ac.fit_predict(X)\n",
"ax2.scatter(X[y_ac==0,0],\n",
" X[y_ac==0,1],\n",
" c='lightblue',\n",
" marker='o',\n",
" s=40,\n",
" label='cluster 1')\n",
"ax2.scatter(X[y_ac==1,0],\n",
" X[y_ac==1,1],\n",
" c='red',\n",
" marker='s',\n",
" s=40,\n",
" label='cluster 2')\n",
"ax2.set_title('Cluster Agglomerative ')\n",
"plt.legend()\n",
"plt.show() \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Veamos cómo queda con DBSCAN"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.cluster import DBSCAN\n",
"db = DBSCAN(eps=0.2,\n",
" min_samples=5,\n",
" metric='euclidean')\n",
"y_db = db.fit_predict(X)\n",
"plt.scatter(X[y_db==0,0],\n",
" X[y_db==0,1],\n",
" c='lightblue',\n",
" marker='o',\n",
" s=40,\n",
" label='cluster 1')\n",
"plt.scatter(X[y_db==1,0],\n",
" X[y_db==1,1],\n",
" c='red',\n",
" marker='s',\n",
" s=40,\n",
" label='cluster 2')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Como puede verse en este caso el resultado mejora ostensiblemente en relación con los dos primeros métodos de clustering que se han presentado.\n",
"\n",
"Existen muchos más métodos para generar clusters de los datos objeto de estudio, el lector interesado puede ver estos métodos [en este enlace](http://scikit-learn.org/stable/modules/clustering.html#clustering){:target=\"_blank\"}. "
]
}
],
"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.5"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Tabla de contenidos",
"title_sidebar": "Contenidos",
"toc_cell": true,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
}
},
"nbformat": 4,
"nbformat_minor": 2
}