{"id":539,"date":"2018-10-21T02:10:37","date_gmt":"2018-10-21T08:10:37","guid":{"rendered":"http:\/\/www.jacobsoft.com.mx\/?p=539"},"modified":"2025-02-20T13:37:50","modified_gmt":"2025-02-20T19:37:50","slug":"k-means-clustering-con-python","status":"publish","type":"post","link":"https:\/\/www.jacobsoft.com.mx\/es_mx\/k-means-clustering-con-python\/","title":{"rendered":"k-Means Clustering con Python"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">k-Means Clustering con Python<\/h2>\n\n\n\n<p>Como se describi\u00f3 en el art\u00edculo anterior: <a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/clustering-analysis\/\">Cluster Analysis<\/a>, el m\u00e9todo k-Medias es un m\u00e9todo no jer\u00e1rquico basado en centroides, robusto y f\u00e1cil de implementar, en donde se requiere especificar previamente el n\u00famero de grupos que se van a generar y a los cuales se van a asignar los datos.<\/p>\n\n\n\n<p>Adicionalmente, este tipo de m\u00e9todos son recomendados para grandes cantidades de datos.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-2380084220870127\"\n     crossorigin=\"anonymous\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2380084220870127\"\n     data-ad-slot=\"2437322509\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Checa el tema en video<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"K Means Clustering\" width=\"780\" height=\"585\" src=\"https:\/\/www.youtube.com\/embed\/SwVCfiJNfwg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe>\n<\/div><figcaption>Suscr\u00edbete tambi\u00e9n a mi canal en <a href=\"https:\/\/www.youtube.com\/channel\/UCHQDZW3R0NqPyAE3kOccOAw\" target=\"_blank\" aria-label=\"youtube (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"aioseop-link\">youtube<\/a><\/figcaption><\/figure>\n\n\n\n<p>El <strong>dataset <\/strong>utilizado en el ejemplo lo puedes descargar de este enlace: <strong><a href=\"https:\/\/drive.google.com\/file\/d\/1d0P1elh1B3lX9g3tE981ZWpZLRl9zAt_\/view?usp=sharing\" target=\"_blank\" rel=\"noreferrer noopener\">dataset<\/a><\/strong><\/p>\n\n\n\n<div style=\"height:21px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>El algoritmo funciona de la siguiente manera: supongamos que tenemos el siguiente conjunto de datos.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"722\" height=\"557\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/before_k_means.png\" alt=\"\" class=\"wp-image-558\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/before_k_means.png 722w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/before_k_means-300x231.png 300w\" sizes=\"auto, (max-width: 722px) 100vw, 722px\" \/><\/figure><\/div>\n\n\n\n<p>Al aplicar el algoritmo, deberemos obtener el siguiente resultado:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"962\" height=\"374\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/after_k_means.png\" alt=\"\" class=\"wp-image-559\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/after_k_means.png 962w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/after_k_means-300x117.png 300w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/after_k_means-768x299.png 768w\" sizes=\"auto, (max-width: 962px) 100vw, 962px\" \/><\/figure><\/div>\n\n\n\n<p>Para llegar a ello, el procedimiento que sigue el algoritmo es el siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Algoritmo k-Means\n1. Seleccionar el n\u00famero de k grupos (clusters)\n2. Generar aleatoriamente k puntos que llamaremos centroides\n3. Asignar cada elemento del conjunto de datos al centroide m\u00e1s cercano para formar k grupos\n4. Reasignar la posici\u00f3n de cada centroide\n5. Reasignar los elementos de datos al centroide m\u00e1s cercano nuevamente\n   5.1 Si hubo elementos que se asignaron a un centroide distinto al original, regresar al paso 4, de lo contrario, el proceso ha terminado<\/code><\/pre>\n\n\n\n<p>Para entender de manera clara el algoritmo anterior, vayamos paso a paso describi\u00e9ndolo gr\u00e1ficamente:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Seleccionar el n\u00famero de k grupos<\/h4>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"914\" height=\"521\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/1_seleccionar_k.png\" alt=\"\" class=\"wp-image-560\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/1_seleccionar_k.png 914w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/1_seleccionar_k-300x171.png 300w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/1_seleccionar_k-768x438.png 768w\" sizes=\"auto, (max-width: 914px) 100vw, 914px\" \/><\/figure><\/div>\n\n\n\n<p>Para este conjunto de datos, digamos que k es igual a 2. (M\u00e1s adelante veremos como seleccionar k).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Seleccionar aleatoriamente k puntos que llamaremos centroides (k = 2)<\/h4>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"548\" height=\"305\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/2_centroides.png\" alt=\"\" class=\"wp-image-561\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/2_centroides.png 548w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/2_centroides-300x167.png 300w\" sizes=\"auto, (max-width: 548px) 100vw, 548px\" \/><\/figure><\/div>\n\n\n\n<p>Los puntos azul y rojo representan los dos centroides ubicados aleatoriamente en el espacio del conjunto de datos.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Asignar cada elemento del conjunto de datos al centroide m\u00e1s cercano para formar k = 2 grupos<\/h4>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"566\" height=\"316\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/3_distancias.png\" alt=\"\" class=\"wp-image-562\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/3_distancias.png 566w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/3_distancias-300x167.png 300w\" sizes=\"auto, (max-width: 566px) 100vw, 566px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"556\" height=\"309\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/3_estan_asignados.png\" alt=\"\" class=\"wp-image-563\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/3_estan_asignados.png 556w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/3_estan_asignados-300x167.png 300w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><\/figure><\/div>\n\n\n\n<p>Cada elemento qued\u00f3 asignado al centroide m\u00e1s cercano a el y de esta manera se forma los k = 2 grupos o clusters, ahora el siguiente paso:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. Reasignar la posici\u00f3n de cada centroide<\/h4>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"719\" height=\"400\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/4_reubicar.png\" alt=\"\" class=\"wp-image-564\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/4_reubicar.png 719w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/4_reubicar-300x167.png 300w\" sizes=\"auto, (max-width: 719px) 100vw, 719px\" \/><\/figure><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">5. Reasignar los elementos de datos al centroide m\u00e1s cercano nuevamente<\/h4>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"674\" height=\"373\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/5_reasignar.png\" alt=\"\" class=\"wp-image-565\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/5_reasignar.png 674w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/5_reasignar-300x166.png 300w\" sizes=\"auto, (max-width: 674px) 100vw, 674px\" \/><\/figure><\/div>\n\n\n\n<p>Como podemos observar, hay elementos azules que ahora est\u00e1n m\u00e1s cercanos al centroide rojo y un elemento rojo del lado de la frontera del centroide azul, por lo que esos elementos ser\u00e1n reasignados.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5.1 Si hubo elementos que se asignaron a un centroide distinto al original, regresamos al paso 4<\/h4>\n\n\n\n<p>Dado que si hubo elementos reasignados, volvemos al paso 4 y cambiamos la posici\u00f3n de los centroides<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"723\" height=\"404\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/5_1_regresamos_4.png\" alt=\"\" class=\"wp-image-566\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/5_1_regresamos_4.png 723w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/5_1_regresamos_4-300x168.png 300w\" sizes=\"auto, (max-width: 723px) 100vw, 723px\" \/><\/figure><\/div>\n\n\n\n<p>Paso 5 nuevamente y reasignamos<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"690\" height=\"384\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/5_nuevamente_cambiamos.png\" alt=\"\" class=\"wp-image-567\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/5_nuevamente_cambiamos.png 690w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/5_nuevamente_cambiamos-300x167.png 300w\" sizes=\"auto, (max-width: 690px) 100vw, 690px\" \/><\/figure>\n\n\n\n<p>Regresamos al paso 4 nuevamente<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"722\" height=\"405\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/6_siguiente_reasignacion.png\" alt=\"\" class=\"wp-image-568\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/6_siguiente_reasignacion.png 722w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/6_siguiente_reasignacion-300x168.png 300w\" sizes=\"auto, (max-width: 722px) 100vw, 722px\" \/><\/figure>\n\n\n\n<p>y el algoritmo continua entre el paso 4 y 5 hasta que ya no haya elementos que se tengan que reasignado de cluster<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"686\" height=\"390\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/7_ultima_asignacion.png\" alt=\"\" class=\"wp-image-569\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/7_ultima_asignacion.png 686w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/7_ultima_asignacion-300x171.png 300w\" sizes=\"auto, (max-width: 686px) 100vw, 686px\" \/><\/figure><\/div>\n\n\n\n<p>Cuando ya no hay elementos que cambiaron de cluster, el modelo ha terminado y tenemos los dos clusters con sus respectivos elementos de la muestra de datos.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"896\" height=\"503\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/8_fin.png\" alt=\"\" class=\"wp-image-570\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/8_fin.png 896w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/8_fin-300x168.png 300w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/8_fin-768x431.png 768w\" sizes=\"auto, (max-width: 896px) 100vw, 896px\" \/><\/figure><\/div>\n\n\n\n<p>Dado que los centroides no son parte del conjunto de datos, estos no se toman en cuenta.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"449\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/9_sin_centroides.png\" alt=\"\" class=\"wp-image-571\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/9_sin_centroides.png 800w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/9_sin_centroides-300x168.png 300w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/9_sin_centroides-768x431.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure><\/div>\n\n\n\n<p>Como se puede intuir, la posici\u00f3n inicial de los centroides puede influir en la agrupaci\u00f3n final de todos elementos y esto generar m\u00e1s de una soluci\u00f3n para la misma cantidad de clusters<\/p>\n\n\n\n<p>Por ejemplo, para un mismo conjunto de datos, podr\u00edamos tener dos o m\u00e1s agrupar los elementos de datos, dependiendo de la posici\u00f3n inicial de los centroides. En la siguiente imagen comparativa, tenemos k = 3 y dos opciones finales para el mismo conjunto de datos:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/comparativa_k_means.png\" alt=\"\" class=\"wp-image-572\" width=\"523\" height=\"178\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/comparativa_k_means.png 902w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/comparativa_k_means-300x103.png 300w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/comparativa_k_means-768x263.png 768w\" sizes=\"auto, (max-width: 523px) 100vw, 523px\" \/><figcaption>3 grupos distintos para el mismo conjunto de datos<\/figcaption><\/figure><\/div>\n\n\n\n<p>Esta ambig\u00fcedad se resuelve con una peque\u00f1a modificaci\u00f3n al algoritmo k-Means que lo convierte en <strong>k-Means++<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-2380084220870127\"\n     crossorigin=\"anonymous\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2380084220870127\"\n     data-ad-slot=\"2437322509\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Selecci\u00f3n del n\u00famero correcto de clusters k<\/h3>\n\n\n\n<p>Para determinar el n\u00famero \u00f3ptimo de clusters que se pueden tener en una muestra de datos, existen varios m\u00e9todos pr\u00e1cticos tanto formales como gr\u00e1ficos que se pueden utilizar, pero una de las t\u00e9cnicas m\u00e1s comunes y robustas, es el <strong>m\u00e9todo del codo<\/strong>.<\/p>\n\n\n\n<p>El m\u00e9todo del codo se basa en la suma de los cuadrados de las distancias de cada elemento de datos con su centroide correspondiente y se denota de la siguiente manera:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"301\" height=\"99\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/wcss.png\" alt=\"\" class=\"wp-image-573\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/wcss.png 301w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/wcss-300x99.png 300w\" sizes=\"auto, (max-width: 301px) 100vw, 301px\" \/><\/figure><\/div>\n\n\n\n<p>Donde WCSS es la suma de los cuadrados de las distancias y se refiere a Within-Cluster-Sum-of-Squares, Y<sub>i<\/sub> es el centroide del elemento o dato X<sub>i<\/sub> y n el total de datos en la muestra.<\/p>\n\n\n\n<p>El proceso se lleva a cabo iniciando con un solo cluster para todos los elementos de la muestra y se obtiene la suma de todas las distancia de cada elemento con el centroide, posteriormente se crean dos centroides y se suman los elementos m\u00e1s cercanos a cada uno de los centroides para sumar las distancias de cada elemento con su centroide correspondiente. El proceso se repite para 3, 4, 5 &#8230; n centroides. Cuando el n\u00famero de centroides es igual a la cantidad de datos de la muestra (n), las distancias son cero, dado que cada elemento es un centroide.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/un_centroide.png\" alt=\"\" class=\"wp-image-574\" width=\"521\" height=\"323\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/un_centroide.png 763w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/un_centroide-300x186.png 300w\" sizes=\"auto, (max-width: 521px) 100vw, 521px\" \/><figcaption>La suma de las distancias para un centroide<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/dos_centroides.png\" alt=\"\" class=\"wp-image-575\" width=\"519\" height=\"320\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/dos_centroides.png 760w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/dos_centroides-300x186.png 300w\" sizes=\"auto, (max-width: 519px) 100vw, 519px\" \/><figcaption>La suma de las distancias para dos centroides<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"858\" height=\"373\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/tres_centroides.png\" alt=\"\" class=\"wp-image-576\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/tres_centroides.png 858w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/tres_centroides-300x130.png 300w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/tres_centroides-768x334.png 768w\" sizes=\"auto, (max-width: 858px) 100vw, 858px\" \/><figcaption>La suma de las distancias para tres centroides<\/figcaption><\/figure><\/div>\n\n\n\n<p>Cada uno de estos valores de WCSS para cada caso, es decir, 1 centroide, 2 centroides, etc. se grafica y obtenemos una gr\u00e1fica similar a la siguiente:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"647\" height=\"474\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/metodo_codo_1.png\" alt=\"\" class=\"wp-image-577\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/metodo_codo_1.png 647w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/metodo_codo_1-300x220.png 300w\" sizes=\"auto, (max-width: 647px) 100vw, 647px\" \/><\/figure><\/div>\n\n\n\n<p>En este ejemplo se realiz\u00f3 el c\u00e1lculo de la suma de las distancias para 1 a 10 clusters y\/o centroides.<\/p>\n\n\n\n<p>El la gr\u00e1fica se observa que la suma de las distancias disminuye conforme aumenta el n\u00famero de clusters y esa disminuci\u00f3n se va atenuando conforme aumentan los n\u00famero de clusters. El punto en donde se hace un codo y el cambio en el valor de la suma de las distancias se reduce significativamente, es el valor que nos indica el n\u00famero \u00f3ptimo de clusters que deber\u00e1 tener la muestra. En este caso el punto \u00f3ptimo es 3<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"814\" height=\"537\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/metodo_codo2.png\" alt=\"\" class=\"wp-image-578\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/metodo_codo2.png 814w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/metodo_codo2-300x198.png 300w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/metodo_codo2-768x507.png 768w\" sizes=\"auto, (max-width: 814px) 100vw, 814px\" \/><\/figure><\/div>\n\n\n\n<p>Para generar la gr\u00e1fica, no es necesario genera los n centroides, cuando n es el n\u00famero de muestras en el conjunto de datos, un valor estimado que permita visualizar la gr\u00e1fica con el codo ser\u00e1 suficiente para determinar ese n\u00famero \u00f3ptimo para los clusters que generar\u00e1 el m\u00e9todo k-Means.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-2380084220870127\"\n     crossorigin=\"anonymous\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2380084220870127\"\n     data-ad-slot=\"2437322509\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<div style=\"height:23px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Implementaci\u00f3n de k-Means con Python<\/h2>\n\n\n\n<p>El <strong>dataset <\/strong>utilizado en el ejemplo lo puedes descargar de este enlace: <strong><a href=\"https:\/\/drive.google.com\/file\/d\/1d0P1elh1B3lX9g3tE981ZWpZLRl9zAt_\/view?usp=sharing\" target=\"_blank\" rel=\"noreferrer noopener\">dataset<\/a><\/strong><\/p>\n\n\n\n<p>Para este ejemplo con python, utilizaremos una muestra de 200 datos de una tienda que ha calificado a sus clientes con una puntuaci\u00f3n que va de 1 a 100 de acuerdo a su frecuencia de compra y otras condiciones que ha utilizado dicha tienda para calificar a sus clientes con esa puntuaci\u00f3n. En el conjunto de datos tenemos informaci\u00f3n sobre el g\u00e9nero, la edad y el ingreso anual en miles del cliente. Sin embargo, para poder graficar los resultados s\u00f3lo utilizaremos el ingreso anual y la puntuaci\u00f3n para generar los grupos de clientes que existen en esta muestra y analizar dicho resultado.<\/p>\n\n\n\n\n<pre><span class=\"coment\"># K-Means Clustering\n\n# Importacion de librerias<\/span>\n<span class=\"key\">import<\/span> numpy <span class=\"key\">as<\/span> np\n<span class=\"key\">import<\/span> matplotlib.pyplot <span class=\"key\">as<\/span> plt\n<span class=\"key\">import<\/span> pandas <span class=\"key\">as<\/span> pd\n\n<span class=\"coment\"># Carga del conjunto de datos<\/span>\ndataset = pd.read_csv('<span class=\"text\">Clientes_Tienda.csv<\/span>')\nX = dataset.iloc[:, [3, 4]].values\n<\/pre>\n\n\n\n<p>Importamos las librer\u00edas y cargamos el conjunto de datos, indicando que la variable que se analizar\u00e1 es una matriz con las columnas 3 y 4 de conjunto de datos, las cuales corresponden al ingreso anual en miles y la puntuaci\u00f3n del cliente.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"548\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/clientes_tienda.png\" alt=\"\" class=\"wp-image-581\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/clientes_tienda.png 700w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/clientes_tienda-300x235.png 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure><\/div>\n\n\n\n<p>La matriz de X es la siguiente:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"416\" height=\"538\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/k_means_X.png\" alt=\"\" class=\"wp-image-582\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/k_means_X.png 416w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/k_means_X-232x300.png 232w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><\/figure><\/div>\n\n\n\n<p>Nuestro siguiente paso ser\u00e1 crear la gr\u00e1fica para el m\u00e9todo del codo y determinar el n\u00famero \u00f3ptimo de clusters que existen en la muestra de acuerdo al ingreso y la puntuaci\u00f3n que le asigno la tienda a cada uno de los clientes.<\/p>\n\n\n\n\n<pre><span class=\"coment\">\n# Metodo del Codo para encontrar el numero optimo de clusters\n<\/span>\n<span class=\"key\">from<\/span> sklearn.cluster <span class=\"key\">import<\/span> KMeans\nwcss = []\n<span class=\"key\">for<\/span> i <span class=\"key\">in<\/span> range(1, 11):\n    kmeans = KMeans(n_clusters = i, init = '<span class=\"text\">k-means++<\/span>', random_state = 42)\n    kmeans.fit(X)\n    wcss.append(kmeans.inertia_)\n\n<span class=\"coment\"># Grafica de la suma de las distancias<\/span>\nplt.plot(range(1, 11), wcss)\nplt.title('<span class=\"text\">The Elbow Method<\/span>')\nplt.xlabel('<span class=\"text\">Number of clusters<\/span>')\nplt.ylabel('<span class=\"text\">WCSS<\/span>')\nplt.show()\n<\/pre>\n\n\n\n<p>En el bloque anterior, generamos los clusters para valores de 1 a 10 (en el rango de 1 a 11) y obtenemos para cada uno de ellos, la suma de las distancias con el tributo inertia_ del objeto kmeans. La gr\u00e1fica obtenida es la siguiente:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"656\" height=\"584\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/codo_python.png\" alt=\"\" class=\"wp-image-584\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/codo_python.png 656w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/codo_python-300x267.png 300w\" sizes=\"auto, (max-width: 656px) 100vw, 656px\" \/><\/figure><\/div>\n\n\n\n<p>El la gr\u00e1fica observamos que la disminuci\u00f3n en la suma de las distancias se aten\u00faa cuando el n\u00famero de clusters es igual a 5, por lo que, para este caso pr\u00e1ctico, el n\u00famero \u00f3ptimo de clusters ser\u00e1 de 5.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-2380084220870127\"\n     crossorigin=\"anonymous\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2380084220870127\"\n     data-ad-slot=\"2437322509\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p><\/p>\n\n\n\n<p>Con ello, ahora generamos el modelo para 5 clusters con el objeto kmeans<\/p>\n\n\n\n\n<pre><span class=\"coment\"># Creando el k-Means para los 5 grupos encontrados<\/span>\nkmeans = KMeans(n_clusters = 5, init = '<span class=\"text\">k-means++<\/span>', random_state = 42)\ny_kmeans = kmeans.fit_predict(X)\n<\/pre>\n\n\n\n<p>la variable y_kmeans guarda los grupos que corresponden a cada rengl\u00f3n de la muestra de datos, lo que significa que cada registro que corresponde a un cliente, esta asignado a uno de cinco grupos que van de 0 a 4<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"416\" height=\"538\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/y_kmeans.png\" alt=\"\" class=\"wp-image-585\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/y_kmeans.png 416w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/y_kmeans-232x300.png 232w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><\/figure><\/div>\n\n\n\n<p>Para poder observar gr\u00e1ficamente la asignaci\u00f3n de los 200 clientes a 5 grupos o clusters realizamos lo siguiente, le asignamos un color a cada grupo y marcamos los centroides en amarillo:<\/p>\n\n\n\n\n<pre><span class=\"coment\"># Visualizacion grafica de los clusters<\/span>\nplt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s = 100, c = '<span class=\"text\">red<\/span>', label = '<span class=\"text\">Cluster 1<\/span>')\nplt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s = 100, c = '<span class=\"text\">blue<\/span>', label = '<span class=\"text\">Cluster 2<\/span>')\nplt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s = 100, c = '<span class=\"text\">green<\/span>', label = '<span class=\"text\">Cluster 3<\/span>')\nplt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s = 100, c = '<span class=\"text\">cyan<\/span>', label = '<span class=\"text\">Cluster 4<\/span>')\nplt.scatter(X[y_kmeans == 4, 0], X[y_kmeans == 4, 1], s = 100, c = '<span class=\"text\">magenta<\/span>', label = '<span class=\"text\">Cluster 5<\/span>')\n\nplt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = '<span class=\"text\">yellow<\/span>', label = '<span class=\"text\">Centroids<\/span>')\n\nplt.title('<span class=\"text\">Clusters of customers<\/span>')\nplt.xlabel('<span class=\"text\">Annual Income (k$)<\/span>')\nplt.ylabel('<span class=\"text\">Spending Score (1-100)<\/span>')\nplt.legend()\nplt.show()\n<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"656\" height=\"584\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/grafica_k_means.png\" alt=\"\" class=\"wp-image-586\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/grafica_k_means.png 656w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/grafica_k_means-300x267.png 300w\" sizes=\"auto, (max-width: 656px) 100vw, 656px\" \/><\/figure><\/div>\n\n\n\n<p>En relaci\u00f3n al ingreso anual en miles y la puntuaci\u00f3n generada por la tienda, observamos un grupo de clientes que podr\u00eda ser de inter\u00e9s para la tienda. El grupo de clientes en color p\u00farpura, lo cuales tienen ingresos altos y una puntuaci\u00f3n alta, por lo que podr\u00edan ser un grupo objetivo para ciertas promociones. En verde tenemos a los clientes de baja puntuaci\u00f3n y bajos ingresos, mientras que en azul, a los clientes con ingresos bajos pero con alta puntuaci\u00f3n, lo cual podr\u00eda indicar que estos clientes compran mucho a pesar de los ingresos bajos. Es decir, el an\u00e1lisis cluster permite hacer inferencias y tomar decisiones.<\/p>\n\n\n\n<p>En el siguiente art\u00edculo, resolvemos el mismo caso pero con el <a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/clustering-jerarquico-con-python\/\">m\u00e9todo jer\u00e1rquico<\/a><\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<style class=\"advgb-styles-renderer\">\n.coment{color:gray;}\n.key{color:blue;}\n.text{color:green;}\n\n.coment{color:gray;}\n.key{color:blue;}\n.text{color:green;}\n\n.coment{color:gray;}\n.key{color:blue;}\n.text{color:green;}\n\n.coment{color:gray;}\n.key{color:blue;}\n.text{color:green;}\n<\/style>","protected":false},"excerpt":{"rendered":"<p>k-Means Clustering con Python Como se describi\u00f3 en el art\u00edculo anterior: Cluster Analysis, el m\u00e9todo &hellip; <\/p>\n","protected":false},"author":2,"featured_media":557,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[25,35,46],"tags":[135,66,57,85,133,58,56,82,134,86,50,132],"class_list":["post-539","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algoritmos","category-inteligencia-artificial","category-machine-learning","tag-algoritmo-de-clustering","tag-analisis-de-datos","tag-ciencia-de-datos","tag-clustering","tag-curso-de-analisis-de-datos","tag-data-mining","tag-data-science","tag-inteligencia-artificial","tag-k-means-clustering","tag-k-means","tag-machine-learning","tag-tutorial-clustering"],"aioseo_notices":[],"author_meta":{"display_name":"Jacob Avila Camacho","author_link":"https:\/\/www.jacobsoft.com.mx\/es_mx\/author\/jacob-avila\/"},"featured_img":"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/destacada_cluster_k_means-300x165.png","featured_image_src":"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/destacada_cluster_k_means.png","featured_image_src_square":"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/destacada_cluster_k_means.png","author_info":{"display_name":"Jacob Avila Camacho","author_link":"https:\/\/www.jacobsoft.com.mx\/es_mx\/author\/jacob-avila\/"},"coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/algoritmos\/\" class=\"advgb-post-tax-term\">Algoritmos<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/\" class=\"advgb-post-tax-term\">Inteligencia Artificial<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Machine Learning<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Algoritmos<\/span>","<span class=\"advgb-post-tax-term\">Inteligencia Artificial<\/span>","<span class=\"advgb-post-tax-term\">Machine Learning<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">algoritmo de clustering<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">an\u00e1lisis de datos<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Ciencia de Datos<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Clustering<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">curso de an\u00e1lisis de datos<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Data Mining<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Data Science<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Inteligencia Artificial<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">k means clustering<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">k-means<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">machine learning<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">tutorial clustering<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">algoritmo de clustering<\/span>","<span class=\"advgb-post-tax-term\">an\u00e1lisis de datos<\/span>","<span class=\"advgb-post-tax-term\">Ciencia de Datos<\/span>","<span class=\"advgb-post-tax-term\">Clustering<\/span>","<span class=\"advgb-post-tax-term\">curso de an\u00e1lisis de datos<\/span>","<span class=\"advgb-post-tax-term\">Data Mining<\/span>","<span class=\"advgb-post-tax-term\">Data Science<\/span>","<span class=\"advgb-post-tax-term\">Inteligencia Artificial<\/span>","<span class=\"advgb-post-tax-term\">k means clustering<\/span>","<span class=\"advgb-post-tax-term\">k-means<\/span>","<span class=\"advgb-post-tax-term\">machine learning<\/span>","<span class=\"advgb-post-tax-term\">tutorial clustering<\/span>"]}},"comment_count":"19","relative_dates":{"created":"Publicado 8 a\u00f1os hace","modified":"Actualizado 1 a\u00f1o hace"},"absolute_dates":{"created":"Publicado el octubre 21, 2018","modified":"Actualizado el febrero 20, 2025"},"absolute_dates_time":{"created":"Publicado el octubre 21, 2018 2:10 am","modified":"Actualizado el febrero 20, 2025 1:37 pm"},"featured_img_caption":"","series_order":"","_links":{"self":[{"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/posts\/539","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/comments?post=539"}],"version-history":[{"count":23,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/posts\/539\/revisions"}],"predecessor-version":[{"id":1799,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/posts\/539\/revisions\/1799"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/media\/557"}],"wp:attachment":[{"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/media?parent=539"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/categories?post=539"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/tags?post=539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}