• 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
      • Calculadora XIRR con Flujos Irregulares
      • Simulador FIRE (Financial Independence, Retire Early)
    • Negocios
      • CLV
      • Scoring
    • Herramientas
      • Formateador / Minificador de JSON
      • Conversor CSV ↔ 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

El índice de Davies-Bouldinen para estimar los clústeres en k-means e implementación en Python

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

Uno de los mayores problemas a la hora de trabajar con el algoritmo de k-means es la necesidad de conocer el número de clústeres en los que se debe dividir el conjunto de datos. Para lo que existen diferentes métodos como el del codo, la Silhouette, Gap Statistics o Calinski-Harabasz. En esta ocasión se va a ver otro método bastante popular, el braseado en el índice de Davies-Bouldinen.

El índice de Davies-Bouldinen

Introducido por David L. Davies y Donald W. Bouldin en 1979, el índice de Davies-Bouldinen (DBI) es una métrica para evaluar la calidad de los clústeres producidos por un algoritmo de clustering. La idea detrás de este índice es que una agrupación de calidad debería producir clústeres separados y compactos.

El índice de Davies-Bouldin se basa en relacionar la dispersión dentro de los clústeres (intra-clúster) y la separación entre clústeres (inter-clúster). Por un lado, la dispersión intra-clúster mide la separación de los puntos dentro de cada clúster. Una dispersión intra-clúster baja indica que los puntos dentro de un grupo están muy cercanos entre sí, algo que es deseable en un buen clustering. Por otro lado, la dispersión inter-clúster mide la separación entre los grupos. Una dispersión inter-clúster alta indica que los grupos están muy alejados entre sí, lo que también es deseable en un buen clustering. El índice de Davies-Bouldin se construye como el cociente de ambos valores. Por lo que cuando los clústeres están separados y son compactos el valor de este índice se minimiza.

Nuevo test de normalidad interactivo en el laboratorio de Analytics Lane
En Analytics Lane
Nuevo test de normalidad interactivo en el laboratorio de Analytics Lane

Para calcular el índice de Davies-Bouldin se pueden seguir los siguientes pasos:

  1. Ejecutar el algoritmo de clustering sobre los datos de interés para obtener los clústeres.
  2. Identificar el centroide de cada grupo, es decir, el punto medio de todos los puntos que pertenecen a ese grupo.
  3. Calcular la dispersión intra-clúster de cada grupo. Para esto, se puede utilizar una medida de distancia, como la distancia euclidiana, para calcular la distancia entre cada punto del clúster y su centroide. Luego, se puede promediar todas estas distancias para obtener la dispersión intra-clúster.
  4. Computar la dispersión inter-clúster entre cada par de clúster. Para esto, se puede utilizar la misma medida de distancia para calcular la distancia entre los centroides de cada par de clúster.
  5. Estimar el cociente entre la dispersión intra-clúster y la dispersión inter-clúster para cada pareja de clústeres. Para cada clúster, seleccionar el valor máximo de la razón obtenida al compararlo con el resto de los clústeres.
  6. Obtener la media de los valores máximos obtenidos en el paso anterior para todos los clústeres.

Implementación en Python del índice de Davies-Bouldin

Los pasos que se han explicado en la sección anterior se pueden usar para implementar una función en Python que implemente el índice de Davies-Bouldin.

import numpy as np
from sklearn.metrics import pairwise_distances

def davies_bouldin_index(data, labels, centroids):
    """
    Calcula el índice de Davies-Bouldin para evaluar la calidad de los clusters.

    Parámetros
    ----------
    data : matriz o matriz dispersa, forma (n_samples, n_features)
        Matriz de características de los datos de entrada.

    labels : array-like, shape (n_samples,)
        Etiquetas de cluster asignadas a cada punto de datos.

    centroids : array-like, shape (n_clusters, n_features)
        Coordenadas de los centroides de los clusters.

    Retorna
    -------
    dbi : float
        Índice de Davies-Bouldin.
    """

    k = len(centroids)

    # Calcular las distancias entre los centroides
    centroid_distances = pairwise_distances(centroids)

    # Calcular las distancias medias intra-cluster
    intra_cluster_distances = np.zeros(k)
    for i in range(k):
        cluster_points = data[labels == i]
        if len(cluster_points) > 1:
            cluster_distances = pairwise_distances(cluster_points)
            mean_cluster_distance = np.mean(cluster_distances)
            intra_cluster_distances[i] = mean_cluster_distance

    # Calcular el índice de Davies-Bouldin
    dbi = 0
    for i in range(k):
        max_similarity = -np.inf
        for j in range(k):
            if i != j:
                similarity = (intra_cluster_distances[i] + intra_cluster_distances[j]) / centroid_distances[i, j]
                if similarity > max_similarity:
                    max_similarity = similarity
        dbi += max_similarity
    dbi /= k

    return dbi

Publicidad


Identificar el número de clústeres con el índice de Davies-Bouldinen

Ahora que se dispone de una función para obtener el índice de Davies-Bouldinen se puede usar esta para estimar el número óptimo de clústeres en el que se debe dividir un conjunto de datos con k-means. Proceso que es similar al usado con la Silhouette o Calinski-Harabasz. Simplemente se debe ejecutar el algoritmo de k-means para diferentes números de clústeres y seleccionar el que ofrece el mejor resultado. En este caso el menor valor del índice de Davies-Bouldinen. Una posible implementación es la que se muestra a continuación

from sklearn.cluster import KMeans

def find_optimal_clusters_dbi(data, max_clusters=10):
    """
    Encuentra el número óptimo de clusters utilizando el índice de Davies-Bouldin.

    Parámetros
    ----------
    data : matriz o matriz dispersa, forma (n_samples, n_features)
        Matriz de características de los datos de entrada.

    max_clusters : int, optional (default=10)
        Número máximo de clusters a probar.

    Retorna
    -------
    optimal_clusters : int
        Número óptimo de clusters según el índice de Davies-Bouldin
        
    """

    dbi_values = []
    for k in range(2, max_clusters+1):
        kmeans = KMeans(n_clusters=k, random_state=42)
        labels = kmeans.fit_predict(data)
        centroids = kmeans.cluster_centers_

        dbi = davies_bouldin_index(data, labels, centroids)
        dbi_values.append(dbi)

    optimal_clusters = np.argmin(dbi_values) + 2

    return optimal_clusters

Evaluación de los resultados

Para comprobar que el resultado obtenido con este método es correcto se puede usar un conjunto de datos aleatorios creados con la función make_blobs() de Scikit-learn. De forma análoga a como se ha hecho para otros algoritmos como Gap stadistics, Eblow, Silhouette o Calinski-Harabasz en ocasiones anteriores. Creando para ello un conjunto con un número conocido de clústeres y se comprueba el resultado que devuelve la función, como se hace en el siguiente código.

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)

find_optimal_clusters_dbi(data)
4

Obteniendo el resultado esperado

Conclusiones

El índice de Davies-Bouldinen es una métrica que permite evaluar la calidad de los clústeres obtenidos para un conjunto de datos. Permitiendo saber cuándo la agrupación es mejor o peor. Esto se puede utilizar para estimar el número óptimo de clústeres en un conjunto de datos cuando se trabaja con k-means.

Hay que tener en cuenta que el índice de Davies-Bouldinen es una alternativa a métodos como el del codo, la Silhouette, Gap Statistics o Calinski-Harabasz entre otros. Cada uno con su propio criterio para seleccionar el número óptimo de clústeres. Por lo que es recomendable usar varios métodos y comparar los resultados antes de seleccionar el número de clústeres.

Imagen de Bruno 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

  • Nuevo test de normalidad interactivo en el laboratorio de Analytics Lane
  • Nuevo conversor de timestamp Unix en el laboratorio de Analytics Lane
  • Calculadora de Contrastes de Hipótesis: interpreta correctamente el p-valor y toma decisiones estadísticas con confianza
  • Calculadora de Tamaño del Efecto: la herramienta clave para entender cuánto importa realmente una diferencia
  • Simulador de DBSCAN: descubre cómo encontrar clusters reales (y ruido) sin fijar K
  • Conversor de Colores: convierte, compara y valida cualquier color en tiempo real
  • Analytics Lane lanza su Generador de UUIDs: identificadores únicos, seguros y listos para producción en segundos
  • 1200 publicaciones en Analytics Lane
  • Analytics Lane lanza su Conversor TIN ↔ TAE: la herramienta definitiva para entender el coste real de depósitos, préstamos e hipotecas

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

Interés compuesto: la fuerza que multiplica tu dinero (y los errores que la anulan)

mayo 14, 2026 Por Daniel Rodríguez

Cómo comparar datos con barras en Matplotlib: agrupadas, apiladas y porcentuales

mayo 12, 2026 Por Daniel Rodríguez

Costes hundidos en ciencia de datos: cuándo mantener un modelo y cuándo migrar

mayo 7, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Qué es la variabilidad estadística y cómo evitar errores al analizar datos publicado el febrero 12, 2026 | en Opinión
  • Cómo determinar el número de componentes en PCA usando la varianza explicada acumulada publicado el enero 31, 2025 | en Ciencia de datos
  • Gráficos de barras en Matplotlib publicado el julio 5, 2022 | en Python
  • Codificación JSON Archivos JSON con Python: lectura y escritura publicado el julio 16, 2018 | en Python
  • Creación de gráficos de barras y gráficos de columnas con Seaborn publicado el julio 18, 2023 | 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

  • bif en JSON en bases de datos: cuándo es buena idea y cuándo no
  • bif en Cómo desinstalar Oracle Database 19c en Windows
  • 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

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