• 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
    • Estadística
      • Calculadora del Tamaño Muestral en Encuestas
      • Calculadora de estadísticos descriptivos
      • Test de normalidad
      • Calculadora de contrastes de hipotesis
      • Calculadora de tamano del efecto
      • Simulador de Regresión Lineal con Ruido
      • Visualizador de PCA
      • Visualizador de Series Temporales
      • Simulador de Regresión Logística
      • Simulador de K-Means
      • Simulador de DBSCAN
      • Detector de la Ley de Benford
    • Probabilidad
      • Calculadora de Probabilidad de Distribuciones
      • Calculadora de Probabilidades de Lotería
      • Simulador del Problema de Monty Hall
      • Simulador de la Estrategia Martingala
    • Finanzas
      • Calculadora de Préstamos e Hipotecas
      • Conversor TIN ↔ TAE
      • Calculadora DCA con ajuste por inflación
      • Simulador FIRE (Financial Independence, Retire Early)
    • Herramientas
      • Formateador / Minificador de JSON
      • Comparador y Formateador de Texto y JSON
      • Formateador y Tester de Expresiones Regulares
      • Inspector de JWT
      • Generador y verificador de hashes
      • Codificador / Decodificador Base64 y URL
      • Conversor de bases numericas
      • Conversor de Timestamp Unix
      • Conversor de colores
      • Generador de UUIDs
    • Juegos
      • Tres en Raya
      • Nim con Q-Learning
    • Más
      • Método D’Hondt
      • Generador de Contraseñas Seguras
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • R
  • Excel

Optimizar el número de clústeres con gap statistics

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

El mayor problema con el que nos podemos encontrar a la hora de usar el algoritmo de k-means es conocer el número de clústeres en los que se divide el conjunto de datos. Un hiperparámetro que en Scikit-learn debe ser indicado al construir el objeto. Por eso existen múltiples métodos para seleccionar este valor como los métodos del codo (elbow method), silueta (silhouette) o índice de Calinski-Harabasz. Otro método bastante popular es el conocido como estadísticas del gap (gap statistics). Veamos en qué consiste y cómo se puede implementar en Python.

El método gap statistics

La forma que usa el método de gap statistics para estimar el número óptimo de clústeres es compara la dispersión dentro del conjunto de datos original con la dispersión que se puede esperar en conjuntos de datos generados aleatoriamente. Así, si se busca el punto en el que se maximiza la diferencias entre ambos valores se obtiene se puede estimar la cantidad óptima de clústeres.

El método gap statistics para obtener el número óptimo de clústeres se puede resumir en los siguientes pasos:

  1. Seleccionar el número máximo de clústeres (k_{max}) para el que se desea evaluar el método.
  2. Entrenar un modelo de k-means con el conjunto de datos para los números de clústers que van desde 1 hasta k_max. Para cada uno de los modelos se debe obtener la varianza intraclúster (W_k).
  3. Generar B veces conjuntos de datos aleatorios, entrenar los mismos modelos de k-means con ellos y obtener la varianza intraclúster promedio (W_k^*).
  4. Calcular para cada valor de k la diferencia del logaritmo de la varianza intraclúster gap(k) = \log(W_k^*) - \log(W_k).
  5. Obtener la incertidumbre en la estadística de gap (s_k).
  6. El valor de k óptimo será aquel que maximice gap(k) y cumpla la condición gap(k) >= gap(k+1) - s_{k+1}.

Implementación del método gap statistics en Python

Una posible implementación del método de gap statistics en Python es la que se muestra a continuación.

Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane
En Analytics Lane
Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane

import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist


def gap_statistics(data, k_max, num_sim=10):
    """
    Estima el número óptimo de clusters en un conjunto de datos utilizando el método de Gap Statistics.

    Parámetros:
    -----------
    data : array, shape (n_samples, n_features)
        El conjunto de datos de entrada.
    k_max : int
        El número máximo de clusters a considerar.
    num_sim : int, default=10
        El número de simulaciones aleatorias a utilizar para la distribución de referencia.

    Retorna:
    --------
    k_opt : int
        El número óptimo de clusters para el cojunto de datos
    gap : array, shape (k_max,)
        La estadística de Gap para cada número de clusters k.
    s_k : array, shape (k_max,)
        La desviación estándar de la estadística de Gap para cada número de clusters k.
    """

    # Calcula los rangos de los datos
    ranges = np.apply_along_axis(lambda x: x.max() - x.min(), axis=0, arr=data)

    # Inicializa las matrices para la función de error W_k
    w_k = np.zeros(k_max)
    w_k_star = np.zeros((k_max, num_sim))

    # Calcula la función de error W_k y W_k_star para cada valor de k
    for k in range(1, k_max + 1):
        # Ejecuta el algoritmo de K-means para k clusters
        kmeans = KMeans(n_clusters=k).fit(data)
        # Calcula la función de error W_k para los datos de entrada
        w_k[k - 1] = np.sum(np.min(cdist(data, kmeans.cluster_centers_, 'euclidean'), axis=1)) / data.shape[0]
        # Genera num_sim muestras aleatorias de los datos y calcula la función de error W_k_star para cada muestra
        for sim in range(num_sim):
            random_data = np.random.random_sample(size=data.shape) * ranges + np.min(data, axis=0)
            kmeans = KMeans(n_clusters=k).fit(random_data)
            w_k_star[k - 1, sim] = np.sum(np.min(cdist(random_data, kmeans.cluster_centers_, 'euclidean'), axis=1)) / random_data.shape[0]

    # Calcula la estadística de Gap para cada valor de k
    gap = np.log(w_k_star.mean(axis=1)) - np.log(w_k)

    # Calcula la desviación estándar de la estadística de Gap
    s_k = np.sqrt(1 + 1 / num_sim)*np.std(np.log(w_k_star), axis=1)

    # Encuentra el número óptimo de clusters k
    k_opt = np.argmax(gap) + 1

    # Regresa la estadística de Gap y su desviación estándar
    return k_opt, gap, s_k

En este ejemplo se define la función gap_statistics que implementa el método gap statistics usando las clases de Scikit-learn. La función devuelve el número óptimo de clústeres, los valores Gap y su incertidumbre para cada valor de k. Valores que se pueden usar para representar de forma gráfica los resultados del método.

Publicidad


Ejemplo de uso

El código implementado en la sección anterior se puede evaluar con un conjunto de datos aleatorios para comprobar que el resultado es el esperado.

from sklearn.datasets import make_blobs

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

# Calcula la estadística de Gap y su desviación estándar para cada valor de k de 1 a 10
k, _, _ = gap_statistics(X, k_max=10, num_sim=10)

print(k)
4

Pudiendo usar la información que devuelve la función para crear una gráfica.

import matplotlib.pyplot as plt

k_max = 10

k, gap, s_k = gap_statistics(X, k_max=k_max, num_sim=10)

# Grafica la estadística de Gap y su desviación estándar
plt.plot(range(1, k_max + 1), gap, 'bo-', label='Gap')
plt.fill_between(range(1, k_max + 1), gap - s_k, gap + s_k, alpha=0.5)
plt.xlabel('Número de clusters k')
plt.ylabel('Estadística de Gap')
plt.title('Método de Gap Statistics')
plt.legend()
plt.show()
Resultados de aplicar el método de gap statistics al conjunto de datos de prueba
Resultados de aplicar el método de gap statistics al conjunto de datos de prueba

Conclusiones

Uno de los problemas más habituales a la hora de trabajar con k-means, uno de los algoritmos más populares en análisis de clúster, es conocer el número óptimo de clústeres para entrenar el modelo, se puede solucionar mediante el método de gap statistics. Un método que se puede combinar con otro para tener una mejor estimación de cual es los clústeres en los que se debe dividir un conjunto de datos.

Imagen de NakNakNak 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?

Publicaciones relacionadas

  • Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane
  • Nueva calculadora de préstamos e hipotecas en el laboratorio de aplicaciones de Analytics Lane
  • Hardening avanzado de NGINX: CSP, OCSP Stapling y defensa en profundidad
  • Nuevo generador y verificador de hashes en el laboratorio de aplicaciones de Analytics Lane
  • Nueva simulación de la estrategia Martingala en ruleta en el laboratorio de aplicaciones de Analytics Lane
  • Exactitud, precisión, recall… y los errores que cometemos al interpretarlas en proyectos reales
  • Nuevo simulador del problema de Monty Hall en el laboratorio de aplicaciones de Analytics Lane
  • Nuevo simulador interactivo de K-Means en el laboratorio de aplicaciones de Analytics Lane
  • Por qué los chatbots de inteligencia artificial parecen estar siempre de acuerdo contigo – Conversar con una inteligencia artificial – Parte I

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

Nuevo Inspector de JWT en el laboratorio de aplicaciones de Analytics Lane

abril 20, 2026 Por Daniel Rodríguez

Nuevo simulador de regresión logística en el laboratorio de aplicaciones de Analytics Lane

abril 17, 2026 Por Daniel Rodríguez

Nuevo simulador de regresión lineal con ruido en el laboratorio de aplicaciones de Analytics Lane

abril 16, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Nuevo Inspector de JWT en el laboratorio de aplicaciones de Analytics Lane publicado el abril 20, 2026 | en Noticias
  • Creación de gráficos de barras y gráficos de columnas con Seaborn publicado el julio 18, 2023 | en Python
  • El método de la bisección e implementación en Python publicado el marzo 11, 2022 | en Ciencia de datos
  • Inclusión de barras de error en Matplotlib publicado el octubre 17, 2022 | en Python
  • Gráficos de barras en Matplotlib publicado el julio 5, 2022 | en Python

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.9 (11)

Pandas: Cambiar los tipos de datos en los DataFrames

Comentarios recientes

  • M. Pilar en Cómo eliminar las noticias en Windows 11 y recuperar tu concentración
  • 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

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