• 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
  • Laboratorio
    • Encuestas: Tamaño de Muestra
    • Lotería: Probabilidad de Ganar
    • Reparto de Escaños (D’Hondt)
    • Tres en Raya con IA
  • 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
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • Excel
  • Matlab

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.

Curiosidad: El origen del análisis exploratorio de datos y el papel de John Tukey
En Analytics Lane
Curiosidad: El origen del análisis exploratorio de datos y el papel de John Tukey

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.

Publicidad


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.

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

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?

Publicidad


Publicaciones relacionadas

  • Curiosidad: El origen del análisis exploratorio de datos y el papel de John Tukey
  • Cómo calcular el tamaño de la muestra para encuestas
  • Curiosidad: La Ley de Twyman y la trampa de los datos “interesantes”
  • Copias de seguridad automáticas en SQL Server con rotación de archivos
  • Curiosidad: La Paradoja de Simpson, o por qué no siempre debes fiarte de los promedios
  • Error npm ERR! code EACCES al instalar paquetes en Node.js: Cómo solucionarlo paso a paso
  • Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo
  • ¿Está concentrado el MSCI World? Un análisis con Gini, Lorenz y leyes de potencia
  • Curiosidad: ¿Por qué usamos p < 0.05? Un umbral que cambió la historia de la ciencia

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.

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
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

Curiosidad: ¿Por qué usamos p < 0.05? Un umbral que cambió la historia de la ciencia

octubre 2, 2025 Por Daniel Rodríguez

¿Está concentrado el MSCI World? Un análisis con Gini, Lorenz y leyes de potencia

septiembre 30, 2025 Por Daniel Rodríguez

Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo

septiembre 25, 2025 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Copiar y pegar Activar copiar y pegar en VirtualBox publicado el mayo 1, 2019 | en Herramientas
  • Gráficos de barras en Matplotlib publicado el julio 5, 2022 | en Python
  • Diferencias entre CPU, GPU, TPU y NPU publicado el abril 19, 2023 | en Herramientas
  • Cerca La regresión logística publicado el julio 23, 2018 | en Ciencia de datos
  • Cómo solucionar problemas de red en VirtualBox: Guía completa publicado el junio 11, 2025 | en Herramientas

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

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

4.5 (10)

Diferencias entre var y let en JavaScript

Publicidad

Comentarios recientes

  • Daniel Rodríguez en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • Pepe en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • CARLOS ARETURO BELLO CACERES en Justicio: La herramienta gratuita de IA para consultas legales
  • Piera en Ecuaciones multilínea en Markdown
  • Daniel Rodríguez en Tutorial de Mypy para Principiantes

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-2025 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto