• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad
    • Tiendas afiliadas
      • AliExpress
      • Amazon
      • Banggood
      • GeekBuying
      • Lenovo

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • Python
  • Pandas
  • NumPy
  • Matlab
  • Julia
  • JavaScript
  • Excel

Número óptimo de clústeres con Silhouette e implementación en Python

junio 23, 2023 Por Daniel Rodríguez Deja un comentario
Tiempo de lectura: 3 minutos

La Silhouette es una métrica que permite evaluar la calidad de los clústeres generados mediante algoritmos de clustering basados en la distancia euclídea. Como es el caso de k-means. Cuantificando la relación que existe entre la separación de los diferentes clústeres y la similitud entre los puntos de un mismo clúster en un valor que varía entre -1 y 1. Los valores cercanos a 1 indican la mejor separación de los clústeres y los cercanos a -1 la peor. Información que se puede utilizar para seleccionar el número óptimo de clústeres en k-means. Siendo una alternativa a otros métodos como el del codo (elbow method), gap statistics o Calinski-Harabasz.

Definición de la Silhouette

La fórmula para calcular el coeficiente de Silhouette (Silhouette Coefficient) se define de la siguiente manera s_i = \frac{b_i - a_i}{\max(a_i, b_i)}, donde a_i es la distancia promedio entre el punto i y todos los demás puntos dentro del mismo cluster y b_i es la distancia promedio entre el punto i y todos los puntos en el cluster más cercano (diferente al que pertenece i).

El coeficiente de la Silhouette solamente puede tomar valores entre -1 y 1. Cuando los clústeres están completamente agrupados, el valor de a_i tiendo a cero y, por lo tanto, el valor de la métrica tiende a 1. Por otro lado, cuando b_i tiende a cero, los clústeres están completamente juntos y el valor de la Silhouette tiende a -1. En el caso de obtener un valor cercano a cero indica que los puntos de un un clúster están en el límite de los dos.

El coeficiente de la Silhouette (s_i) se define para cada clúster. Cuando se dispone de más de dos clústeres se calcula el valor promedio de la Silhouette (Average Silhouette) para disponer de una medida de la calidad de los clústeres.

Estimar la cantidad óptima de clústeres mediante la Silhouette

El valor de la Silhouette promedio se puede utilizar para seleccionar el número óptimo de clústeres en los algoritmos de clustering como k-means. La idea es calcular el valor de la Silhouette para diferente número de clústeres (k) y usar el valor que maximice la métrica. Lo que se puede hacer iterando sobre un rango de valores que va de 2 (la métrica solamente está definida a partir de dos clústeres) a un máximo definido.

Publicidad


Dado que en Scikit-learn existe la función silhouette_score() que implementa el cálculo de la Silhouette, implementar esta algoritmos en Python es extremadamente sencillo. Por ejemplo, se puede hacer con la siguiente función que solamente necesita un conjunto de datos para obtener una estimación del número óptimo de clústeres.

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

def silhouette(data, max_clusters=10):
    """
    Función para seleccionar el número óptimo de clusters utilizando el coeficiente de Silhouette.

    Parámetros:
    -----------
    data : matriz o matriz dispersa, forma (n_samples, n_features)
        Los datos de entrada.

    max_clusters : int, opcional (por defecto=10)
        El número máximo de clusters a considerar.

    Retorna:
    -------
    best_k : int
        El número óptimo de clusters seleccionado por el método de Silhouette
    """

    silhouette_scores = []  # Lista para almacenar los coeficientes de Silhouette

    # Iterar sobre los valores de k
    for k in range(2, max_clusters + 1):
        # Crear un modelo de KMeans con el número de clusters k
        kmeans = KMeans(n_clusters=k)

        # Ajustar el modelo a los datos y obtener las etiquetas de los clusters
        labels = kmeans.fit_predict(data)

        # Calcular el coeficiente de Silhouette para el modelo
        silhouette_avg = silhouette_score(data, labels)

        # Agregar el coeficiente a la lista
        silhouette_scores.append(silhouette_avg)

    # Encontrar el valor de k con el coeficiente de Silhouette más alto
    best_k = 2 + silhouette_scores.index(max(silhouette_scores))

    return best_k

Función que se puede probar con un conjunto de datos sintéticos generado mediante make_blobs() que se puede usar para evaluar los resultados.

from sklearn.datasets import make_blobs

# Genera un conjunto de datos de ejemplo con 4 clusters
data, _ = make_blobs(n_samples=500, centers=4, n_features=2, random_state=42)

silhouette(data)
4

En este caso, como era de esperar, el método devuelve el número de clústeres indicados a la hora de crear los datos.

Conclusiones

El método de la Silhouette es un algoritmo fácil de entender e implementar para seleccionar el número óptimo de clústeres. Por lo que es uno de los más utilizados junto al método del codo (elbow method). Aunque, debido a que generalmente ofrece unos resultados más fáciles de interpretar que este, suele ser una mejor elección cuando solamente se desea emplear un método.

Imagen de Cindy Lever en Pixabay

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Publicidad


Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicaciones relacionadas

  • Cuatro aplicaciones de la Inteligencia Artificial en la Agricultura
    Cuatro aplicaciones de la Inteligencia Artificial en la…
  • Muestreo de Thompson y BayesUCB para un problema Bandido Multibrazo (Multi-Armed Bandit)
    Muestreo de Thompson y BayesUCB para un problema Bandido…
  • Medir la similitud de archivos con Python
    Medir la similitud de archivos con Python
  • Distancias
    Distancias y métricas en aprendizaje automático
  • El método de Hare-Niemeyer y su implementación en Python
    El método de Hare-Niemeyer y su implementación en Python
  • Softmax para un problema Bandido Multibrazo (Multi-Armed Bandit)
    Softmax para un problema Bandido Multibrazo (Multi-Armed…

Publicado en: Ciencia de datos Etiquetado como: Machine learning

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Publicidad




Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Facebook
  • GitHub
  • Instagram
  • Pinterest
  • RSS
  • Twitter
  • Tumblr
  • YouTube

Publicidad

Entradas recientes

El método de Hare-Niemeyer y su implementación en Python

septiembre 29, 2023 Por Daniel Rodríguez

Redimensionar una partición de disco LVM con espacio no asignado en Linux

septiembre 27, 2023 Por Daniel Rodríguez

¿Cómo saber la versión de Pandas o cualquier otra librería en Python?

septiembre 25, 2023 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Unir y combinar dataframes con pandas en Python publicado el septiembre 10, 2018 | en Python
  • ¿Cómo cambiar el nombre de las columnas en Pandas? publicado el mayo 6, 2019 | en Python
  • Enviar mensajes de WhatsApp con Python publicado el marzo 7, 2022 | en Python
  • Sistema de ecuaciones Sistemas de ecuaciones lineales con numpy publicado el octubre 29, 2018 | en Python
  • Ecuaciones multilínea en Markdown publicado el septiembre 14, 2022 | en Herramientas

Publicidad

Lo mejor valorado

4.9 (22)

Seleccionar filas y columnas en Pandas con iloc y loc

4.7 (12)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.6 (15)

Archivos JSON con Python: lectura y escritura

4.5 (10)

Diferencias entre var y let en JavaScript

4.3 (12)

Ordenación de diccionarios en Python mediante clave o valor

Publicidad

Comentarios recientes

  • Daniel Rodríguez en ¿Cómo eliminar columnas y filas en un dataframe pandas?
  • Miguel en ¿Cómo eliminar columnas y filas en un dataframe pandas?
  • alberto en Resolver problema de credenciales en Bitbucket
  • Pablo en Aplicar el método D’Hondt en Excel
  • Agapito en Creación de un EXE desde un archivo Python en Windows

Publicidad

Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2023 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto