Aprendizaje automático: clustering de K-Means | Lazy Programmer Inc | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Aprendizaje automático: clustering de K-Means

teacher avatar Lazy Programmer Inc

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Video de introducción al clustering de K-Means

      3:03

    • 2.

      Una introducción fácil al clustering de K-Means

      6:55

    • 3.

      Ejercicio: encontrar centros de clúster

      9:03

    • 4.

      Solución: encontrar centros de clúster

      10:59

    • 5.

      Ejercicio: encontrar asignaciones de clúster

      4:54

    • 6.

      Solución: encontrar asignaciones de clúster

      6:59

    • 7.

      Ejercicio: K-Means en su totalidad

      6:45

    • 8.

      Solución: K-Means en su totalidad

      16:13

    • 9.

      Objetivo de K-Means (teoría)

      12:52

    • 10.

      Objetivo de K-Means (código)

      5:04

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

81

Estudiantes

--

Proyectos

Acerca de esta clase

El análisis de clúster es un elemento básico del aprendizaje automático no supervisado y la ciencia de datos.

Es muy útil para la minería de datos y el big data porque encuentra automáticamente patrones en los datos, sin la necesidad de etiquetas, a diferencia del aprendizaje automático supervisado.

En un entorno del mundo real, puedes imaginar que un robot o una inteligencia artificial no siempre tendrán acceso a la respuesta óptima, o tal vez no hay una respuesta correcta óptima. Querrías que ese robot fuera capaz de explorar el mundo por su cuenta y aprender cosas solo buscando patrones.

¿Alguna vez te has preguntado cómo obtenemos los datos que usamos en nuestros algoritmos de aprendizaje automático supervisado?

Siempre parece que tenemos un buen CSV o una tabla, completa con Xs y sus correspondientes Ys.

Si no has estado involucrado en la adquisición de datos, es posible que no hayas pensado en esto, ¡pero alguien tiene que hacer estos datos!

Esas "Y" tienen que venir de algún lugar, y la mayoría de las veces eso implica trabajo manual.

A veces, no tienes acceso a este tipo de información o es inviable o costosa de adquirir.

Pero aún quieres tener alguna idea de la estructura de los datos. Si estás haciendo análisis de datos, automatizar el reconocimiento de patrones en tus datos sería invaluable.

Aquí es donde entra en juego el aprendizaje automático no supervisado.

En este curso primero vamos a hablar sobre el clustering. ¡Aquí es donde, en lugar de entrenar en etiquetas, tratamos de crear nuestras propias etiquetas! Haremos esto agrupando datos que se parecen entre sí.

En este curso, aprenderás a construir el algoritmo de clustering k-means.

Requisitos previos:

  • Matemática básica
  • Programación básica de Python

Conoce a tu profesor(a)

Level: Beginner

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. K-Means Cluster Introducción Video: Todos y bienvenidos a mis últimos núcleos aprendizaje automático con clústeres k-means en Python. Entonces, ¿quién soy y por qué deberías escucharme? Bueno, mi nombre es el programador perezoso y soy autor de más de 30 cursos en línea en ciencia de datos, machine learning en análisis financiero. Tengo dos maestrías en ingeniería y estadística. Mi trayectoria en este campo abarca más de 15 años. He trabajado en varias empresas que ahora llamamos Big Tech y múltiples startups. Usando la ciencia de datos, he aumentado los ingresos en millones de dólares con los equipos que he liderado. Pero lo más importante es que me apasiona traerte esta tecnología fundamental. Entonces, ¿de qué se trata este curso? Este curso se trata de enseñarte uno de los algoritmos fundamentales y aprendizaje automático, conocido como clustering k-means. Este es un ejemplo de un algoritmo de aprendizaje automático no supervisado. Lo que significa que está destinado a ser utilizado en conjuntos de datos que no tienen etiquetas. Este curso se enfoca en enseñarte cómo funciona el algoritmo y ayudarte a lograr una comprensión sólida implementando en k-means tú mismo. Estas habilidades son críticas si quieres hacer ciencia de datos y aprendizaje automático en el mundo real. Entonces, ¿quién debe tomar este curso y cómo debe prepararse? Este curso está diseñado para aquellos estudiantes que estén interesados en la ciencia de datos y el aprendizaje automático y que ya tengan alguna experiencia con bibliotecas de computación numérica como NumPy y Matplotlib. Tenga en cuenta que esto también implica que tiene alguna experiencia con las matemáticas vectoriales y matriciales, las cuales serán utilizadas en este curso. La segunda habilidad que necesitarás es algo de programación básica. Cualquier lenguaje está bien, pero como este curso usa Python, eso sería ideal. Por suerte, Python es un lenguaje muy fácil de aprender. Entonces, si ya conoces otro idioma, deberías tener ningún problema para ponerte al día. Y para ambos temas, o a nivel de secundaria, la comprensión debería ser suficiente y una comprensión de pregrado sería aún mejor. Entonces, en cuanto a recursos, ¿qué necesitarás para poder tomar este curso? Por suerte, no mucho. Necesitará una computadora, un navegador web y la conexión a Internet. Y si estás viendo este video, entonces ya cumples con estas condiciones. Ahora, hablemos de por qué deberías tomar este curso y qué debes esperar sacar de él. Bueno, en pocas palabras, la agrupación de K-means es uno de los principales algoritmos cubiertos en cualquier plan de estudios de aprendizaje automático. Es fundamental, ya sea que trabajes en finanzas, biología o cualquier otro campo que implique analizar datos. agrupación de K-medias será una herramienta útil. Al final de este curso, habrás aprendido lo suficiente como para salir y usar lo que has aprendido en conjuntos de datos del mundo real. Entonces espero que estés tan emocionada como yo por aprender sobre este increíble algoritmo. Gracias por escuchar, y nos vemos en la próxima conferencia. 2. Una fácil introducción para el agrupamiento de K-Means: En esta conferencia, voy a presentarles la intuición detrás del agrupamiento de K-means y cómo funciona. Entonces, en primer lugar, sabemos que como se trata de un algoritmo de aprendizaje automático, vamos a estar trabajando en datos. Entonces intentemos visualizar algunos datos que podríamos obtener. Lo primero que notarás de estos datos es que todos estos puntos son del mismo color. Esto se debe a que estamos haciendo aprendizaje sin supervisión. Por lo que no se dan clases a estos puntos. Cada punto es solo el vector, y eso es todo lo que sabemos de cada punto. No sabemos si debe ser de color rojo, azul, o de otra manera. Pero hay una característica importante de este conjunto de datos. ¿Qué notas al respecto? Bueno, nuestras habilidades de reconocimiento de patrones humanos nos permiten ver de inmediato que aquí parece haber tres grupos de datos. En otras palabras, no necesitamos el conjunto de datos para decirnos que estos tres grupos son distintos. Nuestras propias habilidades de reconocimiento de patrones nos permiten ver esto muy claramente. Eso es lo que queremos decir con aprendizaje no supervisado. No es supervisado porque nadie necesita decirnos la respuesta. Este es un concepto clave detrás inteligencia general artificial también. Si vamos a construir una IA que pueda navegar por el mundo real. Prácticamente hablando, probablemente tenga que tener cierta intuición general y capacidad de reconocimiento de patrones ya que sería inviable proporcionarle datos de entrenamiento para cada situación posible que pudiera encuentro. Entonces ese es un punto muy importante. Estamos usando nuestras propias habilidades de reconocimiento de patrones para distinguir estos clústeres. No está en los datos en sí. Pero ahora te habrás dado cuenta de que lo que acabamos ver era una situación muy singular y muy específica. La primera limitación de estos datos es que era bidimensional. Esto es por supuesto necesario porque si tuviéramos, digamos, un conjunto de datos de 100 dimensiones, no lo podrías ver. El universo mismo sólo tiene tres dimensiones de espacio. Entonces eso es todo lo que puedes ver. A veces consigo alumnos que no están convencidos de este hecho. Entonces, si estás convencido de que puedes ver más allá de las tres dimensiones, intenta dibujar un cubo de diez dimensiones y ver qué pasa. Ahora. ¿Por qué menciono esto? Bueno, la mayoría de los datasets del mundo real no son bidimensionales. Por lo tanto, no se pueden ver la mayoría de los datos del mundo real. Y por lo tanto, tus propias habilidades de reconocimiento de patrones no son útiles en este escenario. Sería bueno que tuviéramos algún algoritmo para encontrar clústeres son grupos de datos que podrían funcionar sin importar cuál sea la dimensionalidad de los datos. Por supuesto, de eso se trata todo este curso. Para que puedas tener confianza, ya sabes la respuesta a esta pregunta al final de este curso. Aquí hay otro tema. En los datos originales que te mostré. Lo generé para que mostrara muy claramente tres clusters distintos. Pero, ¿y si nuestros datos se ven así? ¿O qué pasa si nuestros datos se ven así? Ahora se puede ver que los racimos no son tan claros. En general, nos gustaría saber, ¿ el cúmulo que encontré bueno o no? En este curso, vamos a responder a esta pregunta también. Entonces, como un primer paso para comprender la agrupación de k-medias, consideremos dos tipos de verdades fundamentales sobre los clústeres en el conjunto de datos. Supongamos que me dicen que estos puntos amarillos, morados y verdes son los centros de algunos racimos. Y me gustaría saber a qué Centro pertenece este nuevo punto azul? Y creo que tiene sentido intuitivo que este punto por supuesto, pertenezca al centro que está más cerca. Entonces, para decidir a qué clúster pertenece un punto de datos, elijo el centro de clúster más cercano. Bastante intuitivo. Consideremos ahora el segundo dato fundamental sobre los clusters. Supongamos que me dicen que estos puntos de datos que ves aquí pertenecen todos al mismo clúster. Llamémoslos X1 a X C. Nos gustaría saber cuál es el centro de este clúster. Por supuesto, esa es solo la media de todos estos puntos de datos. Esto también se llama el centroide, si estás pensando geométricamente. Y como saben, la manera de encontrar la media de un conjunto de vectores es sumarlos y dividirlos por el número de vectores. Así es como encuentras el cluster center. La gran pregunta, tenemos estos dos hechos fundamentales sobre los clusters. ¿Hay alguna manera de que podamos combinar estas dos ideas para darnos un algoritmo de clustering? Ahora lo creas o no, estos dos hechos fundamentales son todo lo que necesitas para implementar la agrupación K-Means. Resulta que si inicializo los centros de clúster aleatoriamente, entonces si solo repito estos dos pasos una y otra vez, convergeré a una respuesta. Entonces solo para recapitular, comenzamos escogiendo algunos puntos aleatorios como nuestros centros de clúster. Entonces puedo usar el hecho de que cada punto en mi conjunto de datos simplemente pertenece al clúster cuyo centro está más cerca. Por lo que asigno todos mis puntos de datos a su centro de cluster más cercano. Entonces, ahora que sé que cada punto de datos pertenece a un clúster, puedo calcular nuevos centros de clúster en función de todos los puntos que le pertenecen. Después vuelvo al primer paso, que es asignar puntos de datos a los nuevos centros de clúster. Otra vez. Más adelante en esta sección, veremos demostraciones visuales de cómo evolucionan las asignaciones de clústeres y los centros de clúster a lo largo de cada iteración. Vamos a recapitular esta conferencia. Ya que si bien estaba bastante seguro se introdujeron algunas ideas muy importantes. Primero, hablamos del hecho de que a veces es muy fácil para nosotros ver clusters. No necesitamos el conjunto de datos para decirnos la etiqueta para cada punto de datos. Podemos ver fácilmente qué punto de datos pertenece a qué clúster. Eso significa que hemos aprendido a entender los datos de una manera no supervisada. Segundo, es importante entender las formas en que ese ejemplo era limitado. A veces los límites entre los datos podrían no estar tan claramente definidos. Y la mayoría de las veces, no podremos mirar nuestros datos porque nuestros datos no serán bidimensionales. Entonces lo que nos gustaría tener es un algoritmo automático que pueda encontrar clústeres para nosotros dado cualquier conjunto de datos arbitrario. Finalmente, nos fijamos en dos hechos fundamentales sobre los clusters. El hecho de que cada punto deba asignarse al clúster al que está más cercano. Y el hecho de que cada centro de clúster solo debe ser el centro de cada punto que le pertenece. Vimos que cuando combinamos estos dos hechos juntos, obtenemos el algoritmo de clustering k-means. 3. K-Means que el ejercicio promete 1: En esta conferencia, vamos a saltar directamente y a ejercitar tus habilidades de codificación. Este curso está diseñado para ser un curso práctico. Entonces, por cada tema que aprenderás, lo implementarás en código. Como dice mi refrán, si puedes implementarlo, entonces no lo entiendes. En realidad, recientemente descubrí que el famoso físico Richard Feynman decía algo muy parecido. Dijo: Lo que no puedo crear, no entiendo. Entonces si no estás de acuerdo conmigo, entonces también no estás de acuerdo con uno de los físicos más famosos de todos los tiempos. Bien, entonces, ¿cómo puedes practicar lo que acabas de aprender? Bueno en esta conferencia, tu ejercicio será implementar una parte de la agrupación K-means. Entonces aquí está el ejercicio. Primero, vas a generar un conjunto de datos sintético aleatorio llamado x. Como recuerdas, para el aprendizaje automático, x debe ser bidimensional, n por d como el número de muestras y d es el número de características. También vas a crear una matriz unidimensional de identidades de clúster llamada el por qué. Por qué también debe ser de tamaño n, el número de muestras. Esto se debe a que para cada una de las muestras, le vas a dar una identidad de clúster. Recuerda que estos deben ser enteros desde cero hasta k menos uno inclusive, indicando que tienes K clusters en total. Entonces, por ejemplo la primera X podría pertenecer al clúster cero, la segunda X podría pertenecer al clúster uno y así sucesivamente. Ahora bien, la forma en que creas estos datos depende totalmente de ti. Puede hacer los datos aleatoriamente o puede intentar generar datos que sean apropiados para la agrupación en clústeres. Personalmente, optaría por esto último ya que el resultado va a tener más sentido y al final será más agradable visualmente. Digamos para nuestro ejemplo que n es igual a 300, d es igual a dos y k es igual a tres. Esto significa que las identidades de tu clúster tomarán los valores 01.2. Yo sugeriría hacerlo de manera que sus datos se dividan equitativamente entre los tres clústeres. Por lo que tendrás 100 puntos de datos pertenecientes al clúster 1100 puntos de datos pertenecientes al clúster 2.100 puntos de datos pertenecientes al clúster tres. ¿Bien? Entonces, una vez que has generado los datos, ¿ qué haces con ellos? Entonces, para recapitular, lo que tenemos hasta ahora es x, que es de tamaño n por d, e y, que es de tamaño n. El siguiente paso, que es la pieza central de este ejercicio, es calcular la media de cada cúmulo. Entonces, ¿qué implica eso? Bueno, supongamos que tengo tres clusters, así que k equivale a tres. Entonces lo que tienes que hacer es recorrer cada uno de los valores del clúster. Eso es 01.2. Para cada uno de estos clústeres, encuentre cada punto de datos que pertenezca a ese clúster. Entonces, por el bien de este ejemplo, supongamos que elige clúster cero. Entonces quieres encontrar todos los puntos de datos en x que pertenecen al clúster cero. Como recuerdas, esa información se almacena en y, entonces se quiere encontrar la media de todos estos puntos de datos. Como ejercicio, piensa en el tamaño del resultado. Te daré un minuto para pensarlo o puedes pausar este video hasta que tengas la respuesta. Bien, Entonces, ¿cuál es el tamaño del vector medio de todos los puntos de datos que pertenecen a un clúster específico? Bueno, recuerda que todos nuestros puntos de datos son vectores de características que viven en un espacio d-dimensional. En nuestro ejemplo, d es igual en pocas palabras, la media de un grupo de vectores d-dimensionales sigue siendo d-dimensional. En otras palabras, esto simplemente significa que tienes un montón de puntos de datos y quieres encontrar el punto de datos que está en el centroide o el centro de masa. Y claro, hacer esto es solo cuestión de sumar todos los vectores y dividirlos por el número total de vectores. ¿Bien? Entonces ahora supongamos que para cada uno de los k clústeres, se calculan los vectores medios d-dimensionales. Esto significa que tienes k vectores, cada uno de tamaño d. Por supuesto, puedes almacenar esto en una matriz bidimensional de tamaño k por d. Así que ese debería ser el resultado de este ejercicio. Una matriz k por d que contiene los vectores medios d-dimensionales para cada uno de los k clústeres es nuestra salida deseada. Pensemos en este problema de una manera diferente, si acaso no lo entendiste la primera vez. Bien, Entonces supongamos que tenemos n puntos de datos, X1, X2, todo el camino hasta x n Cada uno de estos ejes es un vector d-dimensional. Además, tenemos n, las identidades de clúster correspondientes Y1 e Y2, hasta YN. Cada una de estas y es un entero que puede ser cero hasta k exclusivo. Recuerda que si combinamos todas estas x's en una sola matriz, una X grande, esa era la matriz n por d a la que me refería antes. Podemos hacer lo mismo a todas las y para obtener un gran vector y de longitud n. Hagamos este ejemplo un poco más concreto. Supongamos que Y toma los valores que ve aquí. Entonces Y1 es igual a cero, Y2 es igual a uno, Y3 es igual a y cuatro es uno, y es igual a dos, y es igual a cero, Y siete es igual a cero, y es igual a uno, e y nueve es igual a dos. Debe quedar claro que n es igual a nueve. Ahora, tu trabajo es encontrar la media de todas las x's que pertenecen a cada uno de los clusters. Para clúster cero, hay que encontrar la media de X1, X6, X7. Eso es porque E1, E6 y E7 son cero. Para el cluster uno, hay que encontrar la media de x2, x4 anexo ocho. Eso es porque Y2, y cuatro, e y son iguales a uno. Para el clúster dos, hay que encontrar la media de X3, x5, X9. Eso es porque Y3, Y cinco e Y nueve o igual a dos. Llamemos a estos medios m1, m2 y m3. Lógicamente, estos deberían ser todos vectores de longitud d, ya que son solo el promedio de los vectores de longitud D. Por último, debes combinar estos tres vectores medios en una sola matriz de tamaño k por d, donde en este ejemplo, k es igual a tres. Y recuerda que los datos que usaremos para este ejercicio serán generados aleatoriamente por ti. Como se mencionó anteriormente, puede hacerlo completamente aleatorio o puede hacer que se vea como datos, lo cual es apropiado para la agrupación en clústeres. Ahora podría preguntarse, ¿por qué no podemos usar datos reales para este ejercicio? Esta es una pregunta importante para los principiantes. Recuerda que todos los datos son iguales. Por lo tanto, este ejercicio sería el mismo sin importar qué tipo de datos usemos. Generar los datos usted mismo asegura que comprende la forma y la naturaleza de los datos, lugar de simplemente cargarlos en algún CSV. Por lo tanto, esto requiere una mayor comprensión, lo cual es bueno. Además, ya que tenemos muchos conjuntos de datos prácticos del mundo real utilizados en otros lugares del curso. Ahora no es el momento para eso. Ahora quiero tener claro que todavía no estamos haciendo ningún aprendizaje automático . Esto es solo un ejercicio de programación muy simple para calentarte. Todo lo que estamos haciendo es un poco de geometría, y espero que estén de acuerdo conmigo en eso. Estamos diciendo, Aquí hay un montón de puntos de datos, y cada uno de los puntos de datos pertenece a un grupo diferente. Ahora encuentra el promedio de cada punto de datos dentro de cada grupo. Bien, entonces espero que estés de acuerdo conmigo en que esto es solo un simple ejercicio de programación geométrica. Y no hay nada que temer en este momento. Como bono, dado que nuestros datos son bidimensionales, también podemos trazarlos en una cuadrícula bidimensional. Entonces tu segundo trabajo es este. Primera gráfica, todos los datos en una cuadrícula bidimensional utilizando la gráfica de dispersión. En este diagrama de dispersión, también debe codificar por color cada punto de datos acuerdo con las identidades del clúster almacenadas en la matriz y. No importa cuáles sean los colores reales, solo eso cada punto de datos en el mismo clúster debe tener el mismo color. Por último, ahora que tienes las medias de cada clúster, también debes trazar los centros de cada clúster en la misma gráfica de dispersión. Debe usar un estilo diferente para poder diferenciar los centros de clúster de los puntos de datos reales. Como pueden ver en esta trama, he usado estrellas. Bien, entonces ese es el ejercicio número uno para la agrupación de k-medias. Buena suerte, y nos vemos en la próxima conferencia. 4. Solución para ejercicios 1 (encontrar centros de clúster): En esta conferencia, vamos a ver la solución al ejercicio anterior, k-significa ejercicio número uno. Tenga en cuenta que actualmente no voy a proporcionar el código para este ejercicio ya que es muy corto. Y porque tu trabajo en este curso es aprender a codificar por ti mismo, eso incluye escribir, diseñar y obtener la sintaxis correcta. Por lo menos, deberías poder copiar lo que hago, aunque no recomiendo hacer eso. Si estás haciendo los ejercicios según las instrucciones, no debes tener necesidad de un archivo de código que contenga las soluciones a estos ejercicios. Escribir en el teclado construye memoria muscular, que es una habilidad invaluable para tener al codificar. Si tienes una razón legítima por qué no puedes escribir el código por ti mismo, favor avíseme y haré todo lo posible para acomodarte. Bien, así que comencemos. Primero, vamos a importar numpy y matplotlib a bibliotecas estándar para computación numérica en Python. A continuación, vamos a establecer nuestros parámetros de configuración. Como se mencionó anteriormente. Esto significa que la dimensionalidad de los datos es que el número de clústeres es tres, y el número de puntos de datos es de 300. A continuación, vamos a crear los datos. Esta es quizás la parte más desafiante del guión. Entonces hablemos de lo que queremos hacer a un alto nivel. En primer lugar, la idea básica es que quiero tener tres Nubes de puntos de datos para que cada nube pueda considerarse un clúster diferente. Esta es la imagen que debes tener en mente cuando piensas en la agrupación. Entonces, ¿cómo podemos generar tales nubes? Bueno, una idea posible es extraer muestras de tres distribuciones gaussianas diferentes, cada una con una media diferente. Como recuerdas, una distribución gaussiana se caracteriza por su media y covarianza. El medio nos dirá dónde se encuentra el gaussiano. Y la covarianza nos dirá cómo se extenderían los puntos de datos del gaussiano. Entonces comencemos definiendo tres medios correspondientes a los tres gaussianos. Dirá que mu uno es 00, que está en el origen, dirá que mu dos es 55. Y diremos que mu tres es 05. A continuación, voy a crear una matriz N por D llamada x. Aquí es donde almacenaremos los datos para poblar x, comenzaremos con los primeros 100 puntos, como recuerdas, los dos puntos. Y luego los 100 medios seleccionan los índices desde cero hasta 100. Entonces en el lado derecho, digo generar una matriz de tamaño 100 por d a partir de la normal estándar, y luego agrego un mu1. Esto da como resultado 100 puntos de datos con dimensión dos centrada en mu uno con covarianza de identidad. A continuación voy a hacer lo mismo. Pero para los próximos 100 puntos de datos, esta vez los índices serán de 100 hasta 200. Y en el lado derecho, los puntos de datos estarán centrados en mu dos. Por último, haremos lo mismo para los últimos 100 puntos de datos, para los índices, 200, 300. Estos puntos de datos se centrarán en mu tres. A continuación, voy a crear la matriz y, que nos dice la identidad del clúster correspondiente a cada uno de los ejes. Ya que acabamos de crear el eje y todos están en orden, la estructura de Y es muy simple. Son solo 100 ceros seguidos 100 1's seguidos de 100 dos. Como recuerdas, si creas una lista y la multiplicas por un entero, simplemente se repite ese elemento de la lista tantas veces. Entonces cuando usamos la operación plus en estas listas, el resultado es la concatenación de las listas. Y por último, lanzamos el resultado a una matriz NumPy. Dado que es más fácil trabajar con matrices NumPy, compare dos listas. Tenga en cuenta que aunque nuestros datos tienen una estructura especial con todos los clústeres en orden, el código posterior no asume esto. Es decir, el código que estamos a punto de escribir funcionará con datos con cualquier estructura. Bien, entonces el siguiente paso es visualizar los datos que acabamos de crear. Para ello, crearemos un diagrama de dispersión llamando a la función scatter. El primer argumento pasamos en la primera columna de x. En el segundo argumento, pasamos en la segunda columna de x. En el tercer argumento llamado, especificamos el color correspondiente a nuestro puntos de datos y pasamos en y. tenga en cuenta que y es solo un montón de ceros, unos y dos. Usando este esquema, matplotlib decidirá qué colores reales asignar a nuestros puntos de datos. Por supuesto, puedes tener más control de grano fino si quieres elegir los colores tú mismo. Pero esto es lo suficientemente bueno para nosotros. Bien, entonces ojalá esto sea lo que esperabas ver. Podemos ver que tenemos tres Nubes de puntos de datos, y cada uno de ellos está coloreado de acuerdo a y A continuación, vamos a considerar la pregunta, dada una matriz bidimensional de tamaño n por d, por convención, ¿cómo consigo el tamaño D, ese vector medio de esa matriz? Es decir, quería tomar la media a través de cada una de las n muestras. Ahora hay que tener cuidado aquí, porque si solo llamas a punto medio por sí mismo, vas a conseguir un solo escalar, que es la media de cada elemento de X. No queremos eso, ya que lo que tenemos debería terminar con es un vector medio, no un escalar. Para conseguir lo que queremos, tenemos que pasar en el argumento eje es igual a cero, que dice tomar la media a lo largo de la dimensión n. Si pasas un eje igual a uno, obtendrás la media a lo largo de la dimensión d. Como siempre, te animan a probar estas cosas por ti mismo para que tengas una mejor idea de cómo funcionan. No sólo tome mi palabra para ello. Bien, entonces cuando ejecutamos esto y comprobamos la forma del resultado, obtenemos dos como se esperaba. A continuación, vamos a usar lo que acabamos de descubrir para calcular la media de cada clúster usando las identidades de clúster proporcionadas en la matriz y. Para comenzar, crearemos una matriz de tamaño K por D llamados medios. A continuación, calcularemos la media de cada clúster uno por uno, comenzando con el clúster cero. Bien, entonces este código es bastante compacto, pero de hecho, hay muchas cosas que suceden a la vez. Si no entiendes esto a primera vista, ojalá hicieras el ejercicio de una manera que no tuviera sentido para ti. Así que nunca se tiene que llegar a la misma solución que yo. Sólo hay que llegar a la misma respuesta. Tu código puede ser completamente diferente al mío. Entonces, como saben, el código se puede leer de adentro hacia afuera. Entonces comencemos con lo más interno, que es y es igual, igual a cero. Si no sabes lo que hace esto, recomendaría aislarlo e imprimirlo por sí mismo para que consigas una mejor comprensión. Esencialmente lo que esto devuelve es una matriz booleana. Como sabéis, iguales, iguales deben devolver verdadero o falso. Pero como lo estamos usando en una matriz, razón por la cual el resultado también será una matriz. Como decimos iguales, iguales a cero, la matriz resultante será verdadera en cada ubicación donde y es igual a cero y falso de lo contrario. Bien, entonces, ¿qué pasa cuando indexamos x con esta matriz booleana? Bueno, como habrás adivinado, dado el ejercicio que estamos haciendo, esto selecciona todos los elementos de X donde el índice es verdadero. Bien, entonces ojalá eso tenga sentido. Como recordarás, X es una matriz con n filas. ¿Por qué también es una matriz con n elementos? Cuando decimos y es igual a cero, eso devuelve una matriz booleana con n elementos. Entonces al indexar x con esta matriz booleana, recuperamos solo las partes de X donde el índice era verdadero. Es decir, obtenemos sólo las filas de x correspondientes a cuando y es igual a cero. Equivalentemente, solo obtenemos las filas de X que pertenecen al clúster cero. Finalmente, tomamos la media usando la función mean, pasando un eje igual a cero. Luego asignamos el vector medio resultante a nuestra matriz de medias en el lado izquierdo en el índice cero. A continuación hacemos lo mismo para calcular las medias para el clúster uno y el clúster dos. Bien, entonces técnicamente este es el final del ejercicio. Aunque sería bueno que pudiéramos visualizar lo que acabamos de encontrar. Entonces, el siguiente paso es volver a dibujar nuestro diagrama de dispersión. Pero con el cúmulo significa que calculamos previamente. Primero, comenzaremos dibujando el mismo diagrama de dispersión que teníamos antes. A continuación, volvemos a llamar a scatter, pero esta vez usando el array means que acabamos de crear. Como antes. El primer argumento es la primera columna de medias, que hace referencia a la primera dimensión. Y el segundo argumento es la segunda columna de medios, que hace referencia a la segunda dimensión. A continuación, voy a pasar algunos argumentos adicionales para que la trama sea más fácil de ver. Primero, pasaré en S igual a 500, que controla el tamaño de los puntos de datos. Esto hará que la media sea mucho mayor que los datos. Segundo, pasaré y C es igual al rojo para hacer rojo cada uno de los centros del clúster. Esto diferenciará aún más estos puntos de mis datos. Como nota al margen, este es un ejemplo de cómo podemos establecer el color de los puntos de datos en el diagrama de dispersión manualmente, mientras que no elegimos los colores en el gráfico de dispersión anterior. Por último, pondremos marcador igual a estrella, que en lugar de simplemente aparecer como un círculo, los medios se vean como estrellas, lo que las hará más fáciles de ver. Bien, así que vamos a ejecutar esto. Bien, entonces ojalá esto sea lo que esperas que vea. Cada vector medio aparece aproximadamente en el centro de cada conglomerado. Como se mencionó, estos representan los centros de masa o los centroides de cada cúmulo. Además, podemos ver que se encuentran aproximadamente en los centros gaussianos originales. Una de las estrellas está a las 00, otra a las 05, otra a las 55. 5. K-Means que el ejercicio prompt 2: En esta conferencia, vamos a saltar directamente a su segundo ejercicio para esta sección. Anteriormente, su ejercicio consistía en tomar un conjunto de puntos de datos y un conjunto de identidades de clúster. Entonces había que encontrar la media de los puntos de datos para cada clúster. Esta vez, vas a ir en sentido contrario. Ahora, se le dará un conjunto de medias junto con un conjunto de puntos de datos. Tu trabajo será tomar estos medios y estos puntos de datos y averiguar a qué clúster pertenece cada punto de datos. Así que recuerda que esto se hace acuerdo a la distancia euclidiana, o equivalentemente la distancia euclidiana cuadrada. Tenga en cuenta que dado que los cuadrados de función monótonamente creciente, ya sea que tome el cuadrado o no, no cambia la respuesta. Es decir, si estás comparando distancias, digamos 2.4, si cuadras estas, obtendrás 4.16. Por lo que la relación de que dos es menor que cuatro se conserva porque cuatro también es menor que 16. Y son solo las distancias relativas las que importan porque único que estás tratando de hacer es encontrar la media más cercana. La distancia real en sí no sale en la respuesta. Bien, así como antes, pensemos en un ejemplo muy sencillo de cómo va a funcionar esto. Supongamos que tenemos tres medias, m , cero, M1 y M2. También tenemos nueve puntos de datos, x1, x2, x3, hasta X9. Entonces, ¿qué podemos ver? Lo que podemos ver es que X1, X2 y X3 están todos más cerca de cero que de M1 y M2. Por lo tanto, X1, X2 y X3 pertenecen al clúster cero. De manera similar, podemos ver que X4, X5 y X6 están más cerca de M1 que de cero o M2. Por lo tanto, X4, X5 y X6 pertenecían al clúster uno. Por último, X7, X8 y X9 están más cerca de M2 que a m cero o m1. Por lo tanto, X7, X8, X9 pertenece al clúster dos. Entonces ojalá esto tenga sentido. El reto es poner esta intuición visual en el código. Así es como debería funcionar tu código a un nivel alto. Primero, vas a generar un conjunto de medias en una matriz de tamaño k por d, igual que en el ejercicio anterior. Además, puedes usar los mismos valores para n y d y k que hicimos anteriormente. Entonces n es igual a 300, d es igual a dos y k es igual a tres. Recordar que d es igual a dos es útil porque podemos verlo visualmente. Segundo, también vas a generar una matriz de datos de tamaño n por d. Como antes, puedes crear estas matrices aleatoriamente, pero puede ser útil generarlas de una manera que tenga sentido a partir de una agrupación perspectiva. De cualquier manera que lo hagas depende de ti. Personalmente. Creo que es más útil generar los datos manera estructurada para que después de encontrar la respuesta, puedas trazar los resultados como una comprobación de cordura. Hablando de eso como un bono, te animaría a trazar los resultados con la salida del ejercicio. Como salida, debe tener un vector de longitud n, que nos indica la identidad del clúster de cada punto de datos. Entonces, por ejemplo si la primera x pertenece al clúster cero, entonces el primer valor de su matriz de salida debería ser cero. Por último, quiero señalar que hay muchas formas de hacer este ejercicio. Es posible que hayas escuchado que cuando estás usando NumPy, no es bueno usarlo para bucles porque for-loops o lentos. En cambio, es posible que te hayan dicho que es mejor usar unas operaciones vectorizadas. Es decir, normalmente te gustaría encontrar una función numpy que pueda hacer lo que quieras todo al mismo tiempo. Personalmente, creo que para este ejercicio, es más instructivo hacerlo con for-loops porque te hace pensar lo que está pasando algorítmicamente. En última instancia, si decides usar para bucles o no depende de ti. Por último, quiero reiterar que al igual que el ejercicio número uno, todavía no se trata del todo de aprendizaje automático. De hecho, es solo otro simple calentamiento de programación en geometría. Lo que estamos haciendo es tomar un montón de puntos de datos y un montón de centros. Y solo estamos tratando de averiguar para cada punto de datos qué centro es el más cercano. Entonces espero que estés de acuerdo conmigo en que este ejercicio es sólo otro simple ejercicio de programación geométrica. Bien, así que buena suerte en el ejercicio número dos, y nos vemos en la próxima conferencia. 6. Solución para ejercicios 2: En esta conferencia, vamos a ver la solución para el ejercicio k-means número dos. Como antes, asegúrate de haber completado el ejercicio antes de ver esta conferencia. Tenga en cuenta que actualmente no voy a proporcionar el código para este ejercicio ya que es muy corto. Y porque es tu trabajo en este curso aprender a codificar por ti mismo. Eso incluye escribir, diseñar y obtener la sintaxis correcta. Por lo menos, deberías poder copiar lo que hago, aunque no recomiendo hacer eso. Si estás haciendo los ejercicios según las instrucciones, no debes tener necesidad de un archivo de código que contenga las soluciones a estos ejercicios. Escribir en el teclado y construye memoria muscular, que es una habilidad invaluable para tener a la hora de codificar. Si tiene una razón legítima por qué no puede escribir el código usted mismo, hágamelo saber y haré todo lo posible para acomodarlo. Bien, así que comencemos. Entonces primero vamos a comenzar importando numpy y matplotlib, igual que antes. A continuación, inicializamos nuestros parámetros de configuración. Eso es n, el número de muestras igual a 300, d, el número de entidad es igual a dos, y k, el número de clústeres igual a tres. A continuación, inicializamos tres medios que definiremos nuestros centros de clúster. Para mayor comodidad, he usado los mismos medios que teníamos anteriormente. A continuación, vamos a generar los datos. Comenzamos inicializando una matriz de todos los ceros llamada X de forma N por D. A continuación, establecemos los primeros 100 puntos para que se distribuyan normalmente centrados en la media con covarianza de identidad. Por lo que estos irán en los índices cero hasta 100. A continuación, establecemos los siguientes 100 puntos de datos para que se distribuyan normalmente centrados en la segunda media, también con covarianza de identidad. Estos irán sobre los índices 100 a 200. Finalmente, establecemos los últimos 100 puntos de datos para que se distribuyan normalmente centrados en la tercera media, también con covarianza de identidad. Estos irán sobre los índices 200 hasta 300. A continuación tenemos nuestro bucle principal, que es el corazón de este ejercicio. Este es el bucle donde asignaremos las identidades del clúster. Comenzaremos creando una matriz llamada Y llena con todos los ceros de tamaño n. Por supuesto, esto debe tener tamaño n porque necesitamos una identidad de clúster para cada uno de nuestros N puntos de datos en x. Entonces y es la matriz que almacenará nuestra identidad de clúster. A continuación, recorremos todos los n puntos de datos. Como se mencionó en el prompt de ejercicio anterior, hay muchas formas de hacerlo, incluso sin que tengas que escribir ningún for-loops tú mismo. Sin embargo, esto no es realmente útil para este ejercicio porque escribir las cosas de esta manera te ayuda a pensar en el algoritmo con más claridad. Bien, entonces debería quedar claro que ya que estamos recorriendo todos los n puntos de datos, vamos a encontrar la mejor identidad de clúster uno por uno para cada punto de datos. La idea básica es ésta. Para cada punto de datos, x sub poco n, vamos a recorrer cada una de las medias del clúster. Para cada uno de estos medios, vamos a comprobar la distancia desde x de la pequeña n dos. Eso significa. Haremos un seguimiento de todas estas distancias para que podamos encontrar la que sea mínima. Entonces, si significa cero es el más cercano, entonces eso significa que la identidad del clúster es cero. Si media uno es el más cercano, eso significa que la identidad del clúster es uno y así sucesivamente. Bien, entonces comenzaremos inicializando una variable llamada k más cercana a menos uno. Usamos menos uno como valor centinela. Esto se sobrescribirá a medida que iteremos a través del bucle interno. Del mismo modo, inicializamos una variable llamada min dist a infinito. Claramente esta variable almacenará la distancia mínima de x de n a todas las medias. Al inicializarlo al infinito, cualquier distancia que encontremos dentro del bucle será menor. Bien, entonces a continuación recorremos pequeño k igual a cero hasta el gran K. Es decir, vamos a recorrer cada centro del clúster. Dentro del bucle, encontramos la distancia cuadrada entre x de poco n y medias de k, la k eth media. Si no reconoces por qué esta es la fórmula para la distancia cuadrada, te recomendaría revisar la definición de distancia euclidiana cuadrada. Llamaremos a esta variable D. A continuación, verificamos si d es menor o no que min dist. Por supuesto, la primera vez que iteramos a través de este bucle, se garantiza que esto sea cierto ya que Méndez comienza como infinito y cualquier número finito es menor que infinito. Si esta condición es cierta, hacemos dos cosas. Primero, actualizamos min dist para que sea la distancia actual d. es decir min dist es la distancia más pequeña que hemos encontrado hasta ahora. A continuación, asignamos k más cercano para que sea el k actual. Y nuevamente, esto significa que k más cercano es el índice del centro de clúster más cercano hemos encontrado hasta ahora. Debes estar convencido de que al final de este bucle, K más cercano almacenará el índice del centro del clúster más cercano y Min dist almacenará la distancia correspondiente. Así, en este punto, podemos asignar k más cercano a y, índice que poco n. En otras palabras, k más cercano es la identidad de clúster para el punto de datos x de poca tierra. Cuando se complete el bucle externo, habremos encontrado las identidades del clúster para todos los grandes N puntos de datos. Entonces, como chequeo de cordura, nos gustaría trazar nuestros resultados. Por suerte, ya sabes cómo hacer esto porque lo hicimos en la conferencia anterior. Vamos a ejecutar esto. Bien, entonces ojalá esto sea lo que esperas que vea. Podemos ver que todos los puntos de datos se asignan al color correcto, según cuál de los medios a los que están más cerca. Esos son todos los puntos más cercanos a 00 o a un color, que parece ser morado. Todos los puntos más cercanos al 05, o de un color diferente, que parece ser verde. Por último, todos los puntos de datos más cercanos a 55, u otro color, que parece ser amarillo. 7. K-Means que el ejercicio se promete 3: En esta conferencia, vamos a continuar nuestra discusión sobre el agrupamiento de K-medias. Un dato sorprendente que aprenderás es que al hacer los dos ejercicios anteriores, esencialmente has hecho el 90% del trabajo. Tal vez me recuerdes diciendo que los dos ejercicios anteriores, solo somos calentamientos muy simples. No eran más que unos sencillos ejercicios de programación para hacer algo de geometría. Y sin embargo, al mismo tiempo, lo que verás es que el clustering k-means no es más que estos dos simples ejercicios geométricos repetidos una y otra vez. Antes. Al inicio de esta sección, planteamos dos intuiciones fundamentales sobre los clusters. Recordemos cuáles son. Hechos número uno es que la identidad del clúster de cada punto de datos debe ser el centro del clúster más cercano a. Quiero decir, esto simplemente tiene sentido. ejemplo, supongamos que tenemos dos grupos de estudiantes, los que son muy altos, digamos 6 pies en promedio, los que son muy bajos, digamos 5 pies en promedio. Si tu estatura es de cinco pies 10”, entonces debería ser obvio que perteneces al racimo alto y no al racimo corto. ¿Por qué? Debido a que estás más cerca de 6 pies entonces estás a 5 pies. Entonces ojalá esto sea intuitivo. Entonces aquí está el hecho número dos. El centro del clúster es simplemente el promedio o media de todos los puntos de datos que pertenecen a ese clúster. Eso también tiene sentido si tenemos cinco personas en nuestro grupo que el llamado centro sería la estatura promedio de todos en nuestro grupo. Ojalá esto sea tan intuitivo como el factor número uno. Además, debes reconocer que estos dos hechos no son más que los dos ejercicios anteriores. Anteriormente, dije que k-means clustering simplemente resulta ser un bucle que simplemente repite estas dos operaciones una y otra vez. Entonces, ¿cuál es la implicación de esto? Bueno, significa que al hacer los dos ejercicios anteriores, has implementado esencialmente ya has implementado esencialmente en k-means clustering. Lo único que queda es ponerlos juntos. Por otro lado, parece haber un ligero problema. Lo que uno podría considerar un problema de pollo y huevo. Ves que cada uno de los dos pasos parece depender de los resultados del otro. Para encontrar los medios, se necesitan las identidades del clúster. Pero para encontrar las identidades del clúster, se necesitan los medios que vinieron primero, el pollo o el huevo. La respuesta a esto se llama el paso de inicialización. En este caso, k-means sí proporciona una respuesta para si la gallina o el huevo que viene primero. Básicamente lo que hacemos es asignar los centros del clúster a puntos de datos elegidos aleatoriamente en x así que este es un paso que hacemos antes recorrer los dos pasos que discutimos anteriormente. Entonces el resultado final es este. Para inicializar K-medias, comenzamos escogiendo k puntos aleatorios en x y asignándolos para que sean centros de clúster. Después entramos en un bucle. Dentro del bucle, empleamos el fax número uno. Asignamos cada punto de datos en x a nuestros centros de clúster actuales. La primera vez que esto se ejecuta, esos centros de clúster simplemente serán un subconjunto de los puntos en x La salida de este paso es un nuevo conjunto de identidades de clúster. Luego empleamos hechos y número dos, recalculamos cada uno de los centros de clústeres de acuerdo con las últimas identidades de clúster. Entonces el resultado de este paso es un nuevo conjunto de centros de clúster. Luego repetimos este proceso una y otra vez hasta que el algoritmo converja. Entonces, ¿cómo sabemos cuándo converge el algoritmo? Bueno, es cuando las identidades del clúster dejan de cambiar. Cuando las identidades del clúster dejan de cambiar, entonces obviamente los centros del clúster también dejarán de cambiar. Y no tiene sentido seguir corriendo el loop, ya que la respuesta ya no cambiará. Un detalle crucial que debes conocer sobre la agrupación de K-medias es este. Aunque el proceso que acabo describir parece bastante sencillo, no da como resultado la misma respuesta cada vez que lo ejecutas. Es decir, k-means nunca encuentra una solución global óptima. En cambio, solo es posible encontrar un optima local. Una solución simple para esto es simplemente ejecutar k-means varias veces y luego elegir la mejor respuesta. Vamos a definir lo que mejor significa más adelante en esta sección. Prácticamente hablando, esto es prácticamente todo lo que puedes hacer. Y en el mundo real, esto está bien. Entonces ojalá que el próximo ejercicio no sea una sorpresa. Tu trabajo, antes de pasar a la siguiente conferencia será implementar k-means en código. Recuerda, ya has hecho la mayor parte del trabajo en los ejercicios 1.2 de esta sección. Todo lo que realmente tienes que hacer es poner estas dos cosas en un bucle. El esquema básico de su código debe ser el siguiente. Primero, vas a generar un conjunto de datos llamado X de forma n por d Esta vez, realmente quieres generar un conjunto de datos que sea apropiado para el clustering k-means. Es decir, no generes un conjunto de datos a partir de un solo gaussiano sin clústeres claramente discernibles. Más adelante en esta sección, veremos conjuntos de datos del mundo real. Pero por ahora, solo queremos asegurarnos de que tu versión de k-means haga lo que se supone que debe hacer. A continuación, vas a inicializar los centros del clúster seleccionando k puntos seleccionados aleatoriamente de x. Ya que has creado los datos tú mismo, puedes elegir los valores de N, D, E, y K. Todavía lo recomendaría usando d es igual a dos para que puedas visualizar los resultados. A continuación, vas a entrar en un bucle que realice los dos pasos que discutimos anteriormente. Dentro del bucle, querrás verificar la convergencia. Es decir, cuando las identidades del clúster dejan de cambiar en ese punto, debe salir del bucle. Por último, si eliges D es igual a dos, deberías visualizar los resultados. Puede hacer esto dibujando un gráfico de dispersión de los datos junto con las identidades de clúster que encontró. Además, también debes dibujar los centros de clúster correspondientes. Como ya aprendiste a hacer esto, no debería ser mucho problema volver a hacerlo. Bien, así que buena suerte en este ejercicio, y nos vemos en la próxima conferencia. 8. Solución para ejercicios 3 (K significa en su totalidad): En esta conferencia, vamos a implementar clustering k-means y código. Como siempre, espero que hayas tenido la oportunidad de completar este ejercicio antes de ver esta conferencia. Si no, entonces te recomendaría que detengas este video ahora hasta que hayas completado el ejercicio. Recuerda que esto es para beneficiarte estás aprendiendo. Entonces espero que hayas pasado algún tiempo de calidad en implementar este código. En realidad, el tercer ejercicio debería haber sido mucho más fácil que los dos primeros. Ya que el tercer ejercicio realmente es simplemente juntar los dos primeros ejercicios. Entonces ojalá encontraras que ese era el caso. Bien, así que comencemos. Primero. Nuevamente vamos a importar numpy y matplotlib. A estas alturas ya está familiarizado con cómo hacemos uso de estas bibliotecas. A continuación, volvemos a establecer los parámetros de configuración de R. Eso es d igual a k es igual a tres y n es igual a 300. Entonces la dimensionalidad de los datos es dos, el número de clusters es tres, y el número de muestras es 300. A continuación creamos los datos. Comenzamos por crear primero los verdaderos medios mu uno, mu dos y mu 31. Un factor importante a tener en cuenta es que estas medias verdaderas son desconocidas por el algoritmo K-means. Ellos son conocidos por nosotros porque los estamos usando para crear los datos. Pero k-means no hace uso de estos en absoluto. Es posible que desee repasar el código usted mismo para verificar este hecho. Entonces como antes, vamos a usar los medios 0,055.05. A continuación, creamos nuestra matriz X de tamaño n por d. Establecimos los primeros 100 puntos para que sean una covarianza gaussiana centrada en mu una identidad. Establecimos los siguientes 100 puntos para ser un gaussiano centrado en mu dos, nuevamente con covarianza de identidad. Finalmente, establecemos los últimos 100 puntos para ser un gaussiano centrado en mu tres, nuevamente con covarianza de identidad. Entonces ojalá recuerdes todo esto de los ejercicios anteriores. Ahora bien, podría preguntarse, ahora que estamos haciendo el código de clustering K-means real, ¿por qué todavía no estamos usando datos reales? Entonces esta es una buena pregunta para principiantes y todos los principiantes deberían poder responder a esta pregunta al final de este curso, si no ya. Bien, entonces número uno, recuerda que hemos hecho un buen número de ejemplos sobre datos del mundo real fuera de esta conferencia. El enfoque de esta conferencia es implementar K-Means. El tipo de datos que utilizamos es irrelevante. ¿Por qué es irrelevante? Bueno, recuerda que no importa cuáles sean los datos, este código para clustering k-means no cambiaría. Por lo tanto, no hay ninguna ventaja real el uso de datos reales en este punto. De hecho, sólo hay desventaja. Entonces, ¿por qué es eso? Bueno, eso nos lleva al punto número dos, que es que el uso de datos sintéticos nos permite probar si nuestro código funciona o no como se esperaba. Eso es algo importante y el aprendizaje automático, cuando escribes código, tienes que probar si funciona o no. Pero no puedes hacer eso si usas tu código en algún dataset desconocido de alta dimensión. Por otro lado, este es un conjunto de datos que creamos nosotros mismos y es bidimensional, para que podamos verlo. Lo más importante es que sabemos cuál debe ser la respuesta. Por lo tanto, es una buena manera de probar si nuestro código está funcionando o no. Entonces ojalá ahora tengas un buen entendimiento sobre por qué los datos sintéticos son importantes. Y también, entiendes que todavía vamos a mirar datos reales en otra parte del curso. Así que no has perdido ninguna oportunidad de mirar datos reales. Bien, entonces en este punto, vamos a trazar nuestros datos para que podamos recordarnos a nosotros mismos cómo se ve. Esta vez solo trazaremos x porque eso es lo único que se le da a nuestro algoritmo k-means, como verá en breve. Anteriormente en nuestras dos primeras asignaciones de calentamiento, asumimos que nos dieron los centros de clúster o que se nos dieron las identidades de clúster. Ahora, estamos en un escenario más realista donde no sabemos ninguno, solo conocemos x Sin embargo, incluso solo trazando x por sí mismo, podemos ver intuitivamente dónde deberían estar los clusters. Bien, entonces dibujemos nuestra trama. Entonces ojalá esté de acuerdo en que las agrupaciones de clústeres son muy intuitivas. Posteriormente, cuando aprendas técnicas más avanzadas, comprenderás por qué generar nuestros datos a partir de nubes gaussianas es en realidad el caso de uso ideal. A continuación, comenzamos el código para la agrupación de k-medias. Empezaremos haciendo la inicialización. Como recuerdas, esto implica asignar aleatoriamente los centros del clúster usando puntos elegidos aleatoriamente de x. Entonces primero, comenzamos creando una matriz de centros de clúster de forma K por D. Eso es porque hay son k centros de clúster, cada dimensión de ancho B. A continuación, hacemos un bucle, k veces. Dentro del bucle, elegimos un índice aleatorio de cero hasta n menos uno. Si te interesa, puedes verificar que estos son elegidos de una distribución uniforme. Llamamos a los resultados de este I y I es un entero desde cero hasta n menos uno. A continuación, asignamos x sub I para ser el centro del clúster KF. Entonces tomamos nuestro arreglo de centros de clúster y lo indexamos en k. A continuación, hacemos nuestro bucle k-means. Como ustedes recuerdan, esto implica dos pasos repetidos una y otra vez. Y estos dos pasos son simplemente los dos ejercicios anteriores que ya has hecho. Entonces primero comenzaremos estableciendo una variable llamada max iterates a 20. Esto establecerá un límite superior sobre cuántas veces itera nuestro bucle. Normalmente, k-means converge bastante rápido. Entonces encontrarás que no todas las iteraciones son necesarias. A continuación, creamos una matriz vacía para almacenar las identidades del clúster. Como antes, esta será una matriz de longitud n, que almacena enteros desde cero hasta k menos uno inclusive. A continuación, para fines de depuración, iniciaré una lista vacía llamada identidades de clúster guardadas para ayudarnos a visualizar lo que k-means está haciendo en cada paso, vamos a guardar las identidades del clúster en cada iteración del bucle. A continuación entramos en nuestro bucle. Así que voy de cero hasta máximo iter es exclusivo. Dentro del bucle, primero hacemos una copia de la matriz de identidades del clúster llamando a la función copy. Asignaremos esto a una variable llamada identidades de clúster antiguas. Recuerda que así es como comprobaremos si K-medias ha convergido o no. Si las identidades del clúster no han cambiado de una iteración a la siguiente, entonces no tiene sentido continuar porque si las identidades del clúster son las mismas, entonces las medias también serán las mismo. Por lo tanto, ambos pasos resultarían en ningún cambio. A continuación, también guardamos las identidades de clúster antiguas nuestra lista de guardar las identidades del clúster. A continuación, realizamos el paso uno. Como usted recuerda, esto es para determinar que las identidades del clúster dadas los centros actuales del clúster. Tenga en cuenta que la primera vez que ejecuta este bucle, los centros del clúster son solo puntos aleatorios en X. Esto es Y. los ejercicios anteriores, no era necesario hacer que los datos se vieran bien el manera que lo hice. K-medias en algún momento, calcularemos las identidades del clúster para las cuales las medias del clúster están en el lugar equivocado. Entonces por eso di la instrucción de que podrías crear cualquier x y cualquier conjunto de medios de clúster. El punto era sólo escribir código de trabajo. Bien, así que básicamente deberías reconocer que todo este bucle es exactamente el mismo que lo que teníamos antes. Voy a pasarlo más rápido esta vez, ya que ya lo has visto. Primero, recorrimos todos los n puntos de datos. Dentro de este bucle, inicializamos k más cercano a menos uno, un valor centinela. A continuación, inicializamos min dist al infinito. Esto es para que cualquier distancia finita que calculemos sea menor. A continuación, hicimos un bucle a través de todos los k medios del clúster. Esto se debe a que queremos averiguar cuál de estos está más cerca del n-ésimo punto de datos. Dentro del bucle, calculamos la distancia euclidiana cuadrada entre x sub n y el centro del clúster KF. esto lo llamaremos D. A continuación, verificamos si d es menor que el Min dest actual. Si es así, guardamos la B actual como nuestros nuevos hombres dist, y guardamos k como nuestro k más cercano. Cuando estamos fuera del bucle, asignamos k más cercano para que sea la identidad del clúster enésima. A continuación, tenemos el paso dos, que fue el otro ejercicio que hicimos. Esto es para calcular las nuevas medias de clúster en función de las identidades de clúster que acabamos de encontrar. Entonces nuevamente, deberías reconocer este código desde antes con algunos ajustes de nomenclatura. Como recuerdas, trabajamos de adentro hacia afuera. Primero, usamos iguales iguales para obtener una matriz booleana que nos dice cuál de los puntos de datos pertenece al clúster 01 o dos. Luego usamos esta matriz booleana como índice en x. A continuación, llamamos a la función mean para obtener la media de todos esos puntos de datos. Y le pasamos un eje igual a cero, para que tomemos la media a lo largo de las filas. A continuación, asignamos esto a nuestro array, que contiene los centros del clúster. Una vez que hayamos terminado, paso uno y paso dos, podemos verificar la convergencia. Nuevamente, se puede ver que hacemos uso de iguales-iguales. Queremos saber si nuestras identidades de clúster antiguas o iguales a las nuevas identidades de clúster que acabamos de encontrar como antes, ya que los operandos para iguales, es igual a nuestras matrices NumPy, esto devolverá una matriz NumPy de booleanos que contienen solo verdades y falsos, verdaderos cuando ambos lados son iguales y falsos en caso contrario. Tenga en cuenta que nuestro algoritmo sólo ha convergido si todos los valores son verdaderos. Básicamente estamos haciendo una declaración grande y. Entonces estamos diciendo si la primera posición es verdadera, y si la segunda posición es verdadera, y si la tercera posición es verdadera y así sucesivamente. Una forma abreviada de hacer esto es llamar a la función np dot all. Esto devolverá true si la matriz que pasa contiene todas las trues dentro de la sentencia if, que solo ocurre si la condición es verdadera. Imprimimos en qué iteración convergimos y luego llamamos break para terminar el bucle externo. Bien, así que vamos a ejecutar esto. Bien, así como puede ver, K-medias ha convergido en mucho menos de 20 pasos. A continuación, al igual que en nuestro ejercicio anterior, vamos a trazar el resultado de nuestro algoritmo. Entonces pensemos en esto a un alto nivel. Empezando, todo lo que teníamos era la matriz x. Sí, teníamos los verdaderos medios de clúster, pero estamos fingiendo que no los conocemos. Y de hecho, cuando piensas en lo que tendrías con un conjunto de datos real, no los conocerías. Entonces nuestra trama original era una gráfica de solo los datos sin ningún color y sin ningún centro de clúster. Ahora, después de ejecutar K-means, tenemos más información. Ahora tenemos identidades de clúster, lo que nos permitirá darle a cada punto de cada clúster un color diferente. Además, también tenemos los centros de clúster, por lo que también podemos dibujar los de nuestra parcela. Como recordarán, antes las dibujamos como grandes estrellas rojas. Bien, entonces ojalá puedas reconocer este código desde antes. La primera línea realiza una gráfica de dispersión de los datos, coloreando cada punto de datos por las identidades del clúster. Entonces todos los puntos pertenecientes al cluster cero, tendremos un color, todos los puntos pertenecientes al cluster uno, tendremos otro color, y así sucesivamente. A continuación llamamos a la función scatter. Pero esta vez en las medias, como antes, pasamos en S es igual a 500, hacemos que estos puntos de datos sean más grandes y pasamos en Z igual a rojo para hacerlos rojos. Y colocamos marcador igual a estrella, así que aparecen como estrellas. Bien, así que vamos a ejecutar esto. Bien, entonces ojalá esto sea lo que esperas que vea. Se trata de los mismos datos que antes, pero ahora tiene colores de acuerdo con las identidades de clúster encontradas por K-medias. Además, hemos marcado los centros de cúmulos con estrellas rojas. Esta es toda la información que no teníamos antes de ejecutar K-means donde solo tenemos los datos en sí. A continuación, tenemos un bucle corto para visualizar el proceso de entrenamiento. Como recuerdas, guardamos las identidades del clúster en cada paso de k-means. Entonces, al trazar los datos de acuerdo con las identidades del clúster en cada paso, podemos ver cómo evolucionan los clústeres a medida que el algoritmo aprende. Bien, entonces si quieres entender este código, lo revisaré muy rápido. Primero, tomamos el número de identidades de clúster que hemos almacenado. Tenga en cuenta que esto es variable, ya que no sabemos cuántas veces irá el ciclo de entrenamiento, asignaremos esto a una variable llamada m. A continuación, llamamos a la función en plt.plot subplots para establecer el tamaño de la parcela. El primer argumento establece el ancho, y el segundo argumento dice el alto. He elegido el número de cinco arbitrariamente, que es lo suficientemente grande para mí. Pero lo importante es establecer la altura, que es m, multiplicada por el tamaño del ancho. Esto se debe a que vamos a hacer em una subtrama y queremos que todas encajen. Cada una de las subparcelas individuales será de cinco por cinco. Bien, entonces a continuación hacemos un bucle m veces. Dentro del bucle llamamos plt.show subplot. Hay tres argumentos para esta función. Primero es el número de filas en nuestra parcela, y el segundo es el número de columnas en nuestra parcela. Entonces vamos a tener m filas y una columna. Es decir, vamos a hacer parcelas em y todas van a estar una encima de la otra. El tercer argumento especifica qué trazado está fuera de la m por una parcela. Básicamente esto es solo yo más uno, ya que el primer valor de i será cero. A continuación obtenemos y, que se asignará a las identidades del clúster en la iteración i. A continuación llamamos plt.show scatter pasando en nuestros datos y por qué la configuración de color actual. Bien, así que vamos a ejecutar esto. Bien, así que ojalá esta trama sea útil para que veas la progresión de k-means. Se puede ver que empezamos con todo del mismo color porque inicializamos las identidades del clúster para que sean una matriz de todos los ceros. Entonces podemos ver que poco a poco mejora la separación de cúmulos. Finalmente, terminamos con las identidades de clúster finales, momento en el que hemos dejado de entrenar. Lo importante a notar es cómo las identidades del clúster mejoran lentamente en cada paso. Al establecer las identidades del clúster de manera inteligente, las identidades del clúster no empeoran, solo mejoran. En conferencias posteriores, cuantificaremos esta idea. 9. K-Means objetivo (teoría): En esta conferencia, vamos a hablar sobre la función objetiva k-means. Para introducir esta idea, ayuda tener algo de experiencia con otros modelos de aprendizaje automático primero, como la regresión lineal y la regresión logística. Entonces, si lo haces, eso te será de mucha ayuda. Pero si no lo haces, entonces haz tu mejor esfuerzo para seguirlo. Entonces, esencialmente, la regresión lineal, regresión logística y la agrupación de K-medias son todos ejemplos de aprendizaje automático. La palabra clave en esta frase es aprender. Así, la pregunta importante que hay que hacer es, ¿qué queremos decir con aprender? En términos generales, nuestro modelo suele tener algún objetivo. Sí, se podría decir que nuestro objetivo es aprender, pero queremos ser más específicos y particulares. El objetivo es un número. En el aprendizaje supervisado como regresión lineal y la regresión logística, ese número es el error. Se puede pensar en el objetivo, como cuántos errores cometo. Así aprender es configurar tu cerebro de tal manera que cometas cada vez menos errores. Entonces espero que la analogía con el aprendizaje humano sea clara. Aprender equivale a configurar tu cerebro o tu modelo del mundo para cometer menos errores. En regresión lineal, nuestro objetivo es la suma de errores cuadrados. Hay múltiples razones por las que esto tiene sentido, pero aquí hay una razón simple. La regresión lineal se trata de encontrar la línea de mejor ajuste. Es decir, nos gustaría que la línea estuviera lo más cerca posible de los puntos. En esta trama, se puede ver que a veces nuestra línea de best fit sobreestima cuando hace una predicción, y otras veces subestima. Así, el error en realidad puede ser positivo o negativo. Por supuesto, no quieres simplemente sumar las áreas juntas porque si agregas un número positivo y un número negativo que son iguales, entonces obtendrás cero. Por ejemplo, si uno de los errores es más cinco y el otro error es menos cinco, más cinco más menos cinco es cero. Y obviamente no quieres que el error total sea cero cuando tu modelo realmente cometió un error distinto de cero. Por lo tanto, cuadramos los errores para que todos sean positivos. Para convertirlos en un solo número, los sumamos juntos, de ahí, la suma de errores al cuadrado. Llamamos a esta suma de errores cuadrados o función de costo. Tenga en cuenta que existen otros tipos de funciones de costo, como la entropía cruzada, que se utiliza para la regresión logística. No obstante, para este curso, nos interesa primordialmente el error al cuadrado. El siguiente paso cuando estás entrenando un modelo de regresión lineal o regresión logística es averiguar cómo actualizar los parámetros del modelo para que puedas hacer que el error sea más pequeño. Exactamente cómo haces esto está fuera del alcance de este curso, pero te animamos a aprender sobre regresión lineal y regresión logística si tienes curiosidad. Lo importante es tener en cuenta que al igual que el clustering k-means, esto se hace iterativamente. Es decir tenemos algún bucle. Dentro del bucle, actualizamos los parámetros del modelo. En cada iteración del bucle, esperamos actualizar los parámetros del modelo de tal manera que el error siempre mejore. Nuevamente, la forma en que hacemos esto está fuera del alcance de este curso, pero reconozca que se puede hacer. Obsérvese que la analogía con aprendizaje humano también tiene sentido en este contexto. Se puede pensar en cada iteración del bucle como un paso a través de los datos de entrenamiento. Es decir, cada vez que llegues a ver los datos de entrenamiento, tu comprensión de los mismos mejora tal manera que disminuirás las áreas que haces. Esto es cierto tanto para los humanos como para las máquinas. Cuanto más practico, más inteligente me vuelvo. Bien, Entonces resulta que muchos algoritmos de machine learning son entrenados de esta manera. El método es, pensamos en alguna función de costo útil. Entonces derivamos alguna regla de actualización tal que si seguimos aplicando esta regla de actualización, el modelo mejora su error. Eventualmente, el error converge a algún valor mínimo, momento en el que se puede ver que ha terminado ese aprendizaje. En estas situaciones, es útil trazar tu costo por iteración cuando entrenamiento esté completo para que puedas verificar que el proceso de capacitación fue exitoso. Y nuevamente, muchos algoritmos utilizan este método de aprendizaje. Como se mencionó anteriormente, esto se aplica a la agrupación de k-medias, regresión lineal y regresión logística. También se aplica a redes neuronales profundas, aprendizaje por refuerzo y factorización matricial, solo por nombrar algunos ejemplos más. Bien, entonces esa es la idea de aprender y costar funciones en general. Pero, ¿cuál es la función de costo o la función objetiva para k-means? Como nota al margen, recordemos que costo y objetivo y pérdida y error son todos sinónimos. Si alguna vez utilizo uno de estos términos en lugar del otro, no se alarme. Todos significan lo mismo. En cualquier caso, si se siente cómodo con la suma de errores cuadrados para regresión lineal, entonces también se sentirá cómodo con la función de costo para k-medias, que se ve muy similar. Bien, entonces pasemos por esto lentamente para que entiendas cada componente del objetivo. En primer lugar, se puede ver que es en forma de una suma de errores al cuadrado. Sumamos sobre todos los n puntos de datos y cuadramos la cosa dentro. Tenga en cuenta que debido a que x sub n y m sub k son vectores, denotamos la distancia euclidiana con barras dobles. Esta es nuestra notación para la norma. La parte que resulta confusa para algunas personas es la extraña notación. A esto se le llama función de indicador. Tiene un valor de uno cuando el argumento es verdadero y cero en caso contrario. Como recuerda, y sub n almacena la identidad del clúster del n-ésimo punto de datos. Por lo tanto, podemos interpretar esto de la siguiente manera. Aunque sumamos sobre todos los valores de k, solo uno de ellos contribuye al costo. Es el que es igual a y de n. Y esto se debe a que y de n asigna X de n a uno un racimo. Por lo tanto, el costo es la distancia cuadrada entre x sub n y la media de cualquier cluster al que pertenezca. Entonces ojalá eso tenga sentido. Sumamos sobre todos los n puntos de datos. Para cada uno de los n puntos de datos, agregamos una sola distancia cuadrada. La distancia cuadrada que agregamos es la distancia cuadrada entre x sub n y la media del cúmulo al que pertenece. Entonces, si x sub n pertenece al clúster k, entonces agregamos la distancia cuadrada entre x de n y m sub k. Como nota al margen, se puede ver que poco k suma de uno hasta grande K. En el código. Pequeñas sumas de casos desde cero hasta k menos uno. Esto solo se debe a cómo funciona la programación en Python. Así que solo ten en cuenta esta diferencia. Cuando estamos escribiendo ecuaciones, normalmente es más fácil contar desde uno en lugar de cero. También vale la pena hablar por qué este objetivo tiene sentido. Para entender esto, podemos considerar algunos escenarios diferentes. Primero, consideremos el escenario donde los clusters están muy claramente definidos. Todos los puntos de datos que pertenecen a un clúster están muy cerca del centro del clúster. Como ese es el caso, todas las distancias cuadradas serán muy pequeñas. Y por lo tanto, la suma total de distancias cuadradas también será muy pequeña. Bien, ahora consideremos un segundo escenario. Esta vez, los clusters están menos bien definidos. Ahora, los puntos de datos pueden estar muy lejos del centro del clúster. Debido a esto, las distancias cuadradas son mayores y por lo tanto la suma total de distancias cuadradas será mayor. La función de costo no favorece este escenario porque los clústeres están menos bien definidos que antes. Ahora consideremos un tercer escenario con las asignaciones de clúster reales que están equivocadas en este caso, porque los puntos de datos no se le asignan al centro de clúster más cercano. La distancia al cuadrado entre cada punto de datos y el centro del clúster al que realmente está asignado será muy grande. Debido a que estas distancias son muy grandes, la suma total de distancias cuadradas también será muy grande. Así que claramente, para que el costo sea pequeño, debemos asignar cada punto de datos al centro del clúster más cercano, minimizando así la distancia es. Tenga en cuenta que debido al algoritmo k-means, podemos escribir la función objetiva de una manera alternativa y tal vez esta sea más fácil de entender. Entonces en este foro, ya no tenemos que sumar más de k Sabemos que x de n se asignará a dos cualquiera que sea el clúster al que esté más cerca. Por lo tanto, la parte interna del costo es solo la distancia cuadrada entre x de n y la media que esté más cerca usar la raíz cuadrada de la distancia euclidiana. De esta forma, tomamos la distancia mínima directamente usando la notación Min. Otra forma más de escribir el objetivo k-means es esta. Podemos definir una cantidad llamada matriz de responsabilidad, denotada por la letra R. Básicamente esto es lo mismo que la función indicadora que vimos anteriormente. Pero ahora es una matriz en lugar de una función, esencialmente r de n k, es decir, el valor en la fila n, columna k es igual a uno. Si x de n pertenece al clúster k, lo contrario es cero. Deberías poder verificar que cada fila de nuestro correspondiente a un único punto de datos en X contiene solo una sola y el resto de los valores deben ser cero. Eso es porque x solo puede pertenecer a un solo clúster. En otras palabras, x solo puede tener una única identidad de clúster. Y así nuevamente, tenemos esta situación en la que a pesar de que sumamos sobre todos los valores de k, técnicamente en la actualidad, solo uno de estos términos es distinto de cero y el resto son cero porque el valor de responsabilidad es cero cuando x no pertenece a esos clústeres. Un dato interesante es que para k-medias, no derivamos el algoritmo de aprendizaje de la función de costo. Todo lo que hicimos fue partir de dos simples datos sobre agrupación que parecían tener sentido. Entonces descubrimos que si repetimos estos dos hechos simples en un bucle, terminaríamos con k-medias. Para recapitular, estos dos hechos son los siguientes. Número uno, las identidades del clúster deben asignarse de manera que X de n pertenezca al centro del clúster más cercano. Y número dos, los centros de clúster son apenas el promedio de todas las x's que le pertenecen. Sin embargo, usando lo que sabemos sobre las funciones de costo, esto no parece muy riguroso. Podría preguntarse si la regresión lineal y las redes neuronales pueden derivar sus reglas de aprendizaje a partir de la función objetiva, ¿por qué podemos hacer esto para la media K? En este punto, aún no estamos listos para entender cómo se puede derivar este algoritmo. Pero si quieres aprender más, te animamos a conocer los modelos de mezcla gaussiana, también conocidos como GMM. Gmm es o un modelo probabilístico, que puede ser visto como una generalización de agrupamiento de K-medias a través de la lente del GMM, se puede derivar el algoritmo de actualización para K-medias en términos de probabilística cantidades. Entonces, si buscas una derivación más rigurosa, ese sería el siguiente paso a explorar. El punto principal de esta conferencia es comprender la idea de que k-means tiene una función objetiva en primer lugar. Esto no lo habrías sabido solo por el propio algoritmo. Por eso no lo hemos discutido hasta ahora. El segundo punto es que esto nos prepara para escribir más código. En particular, su próximo ejercicio es éste. Toma el código k-means que teníamos antes y añadimos más código para que después del entrenamiento, podamos trazar la función objetiva en cada iteración. Esperamos que en cada iteración de clustering k-means, el objetivo se haga cada vez pequeño hasta que converja a algún valor mínimo. Así que por favor escribe este código y confirma que esto es cierto. Bien, así que ese es el ejercicio. Buena suerte, y nos vemos en la próxima conferencia. 10. Objetivo K-Means: En esta conferencia, vamos a completar el siguiente ejercicio de implementación de k-means, que es trazar la función de costo durante el proceso de capacitación. Una vez que hayamos hecho esto, podemos considerar nuestra implementación k-means completa. Como verás, esto es solo una simple modificación del código que ya hemos escrito. Desde que concluimos la mayor parte del trabajo en la conferencia anterior. Como siempre, asegúrate de haber completado este ejercicio antes de ver esta conferencia, ya que esa es tu tarea para este curso. En otras palabras, no mires las soluciones para la tarea antes de haber completado la tarea. Bien, así que comencemos. Primero, puedes ver que todas las partes iniciales del código son iguales. Las entradas son las mismas, los datos son los mismos. Lo que nos interesa es el bucle de entrenamiento k-means. Así que vamos a desplazarnos hacia abajo hasta esa parte del cuaderno. Ahora, es posible que hayas asumido que tendríamos una función separada para calcular el costo, pero resulta que es más sencillo calcular dentro de nuestro ciclo de entrenamiento. Tenga en cuenta que vamos a utilizar la versión del costo que contiene el operador Min. En este caso, no hay necesidad de hacer una doble suma sobre las n muestras y los k clusters. La verdadera razón por la que necesita sumar sobre los k clústeres es porque necesita averiguar a qué clúster pertenece cada punto de datos x de n. En K-medias, esto se define por la distancia mínima entre x de n y cada una de ellas significa. Sin embargo, recordarás que ya encontramos esto en el código. Así, si hiciéramos una función para hacer esto, estaríamos repitiendo el trabajo que ya hicimos, lo cual sería ineficiente. Bien, entonces veamos el código para que podamos revisar donde ya hicimos este cálculo. Primero, antes incluso de entrar en el bucle de entrenamiento, vamos a crear dos nuevas variables. Tenemos discos Min, eso es plural, que es una matriz que almacenará las distancias mínimas para todas las n muestras. A continuación, tenemos una lista para almacenar los costos. Esta es una lista y no en matriz ya que el número de iteraciones es variable. Entonces esto va a almacenar el costo en cada iteración. Bien, entonces dentro del bucle, veamos cuidadosamente el paso número uno. Notarás que hacemos dos bucles, uno sobre los n puntos de datos y otro sobre los k clústeres. Para cada uno de los k clústeres, calculamos la distancia euclidiana de raíz cuadrada entre la media del conglomerado, el n-ésimo punto de datos. Además, recordarás que almacenamos esto en una variable llamada min dist. Esto es exactamente lo que necesitamos para el costo. Por lo tanto, todo lo que tenemos que hacer es que nuestro bucle interno esté completo. Simplemente guarde el disco men en la matriz min discos. Una vez que hayamos completado el paso uno, ahora tenemos todos los discos N Min, que son las distancias euclidianas cuadradas entre cada punto de datos y el centro del clúster más cercano. Como saben, el costo total es sólo la suma de estos. Por lo tanto, llamamos a la función Suma en hombres esto para obtener el costo, y almacenamos esto en nuestra lista de autos. Después de eso, el resto del código es el mismo. Entonces, una vez que hayamos terminado el entrenamiento, podemos llamar a plt.plot para trazar el costo por iteración. Entonces, como puede ver, el costo por iteración disminuye en cada iteración y eventualmente converge a algún valor mínimo como se prometió. Y nuevamente, recordemos por qué esto es importante. Esto es importante hacerlo siempre que estés entrenando un modelo usando un algoritmo iterativo. Por lo general, esto implica minimizar o maximizar algún objetivo. Por lo tanto, le gustaría trazar ese objetivo sobre cada iteración para verificar que su código funcione según lo previsto. De hecho, a veces como en el aprendizaje profundo, incluso si tu código es correcto, las cosas aún pueden fallar debido a selección subóptima de hiperparámetros. Entonces esa es otra razón por la que necesitas trazar el costo por iteración. Si no lo haces, entonces no tienes idea si tu modelo ha aprendido lo que se suponía que debía aprender solo porque tu código es correcto. Esto no significa que los hiperparámetros que eligió también sean correctos. Entonces la lección es, siempre que tenga un algoritmo iterativo, siempre es importante trazar el costo por iteración.