es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agrupamiento jerárquico en python usando solo numpy/pandas.

Soy realmente nuevo en Python y ciencia de datos y realmente necesitaría algo de ayuda, por favor.
Tengo un dataframe con 440 observaciones y 6 variables descriptivas. Se supone que debo realizar un agrupamiento jerárquico de los datos, pero SOLO con la ayuda de los paquetes numpy y pandas. No puedo usar scipy o sklearn. Hasta ahora, pude crear la matriz de distancia (matriz numpy de 440×440). Solo quiero dos grupos. En cuanto al método de enlace, quiero usar enlace ward, pero el método de centroides también funcionaría. ¿Cómo puedo crear dos grupos a partir de la matriz de distancia en función del criterio de enlace? Pensé en algo como “encontrar la distancia más pequeña, colocar el valor de columna / fila correspondiente en un grupo, eliminarlos de la matriz de distancia, volver a hacerlo hasta que la matriz antigua esté vacía y tenga una nueva matriz con tuplas de índices de fila / columna, y volver a hacer eso hasta que solo me queden 2 filas / columnas que incluyan todas mis observaciones originales…”.
Sé que no es una buena descripción, pero como dije, soy realmente nuevo en esto y agradezco cualquier consejo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hola,

    Entiendo que eres nuevo en Python y en ciencia de datos y necesitas ayuda para realizar un agrupamiento jerárquico en un dataframe utilizando solo los paquetes numpy y pandas. Aquí te explico cómo puedes crear dos clusters a partir de la matriz de distancias basada en los criterios de enlace:

    1. Inicializa una lista de clusters, cada uno conteniendo una sola fila de la matriz de distancias.
    2. Mientras el número de clusters sea mayor que 2, calcula las distancias entre todos los clusters utilizando los criterios de enlace (ward o centroide).

    3. Encuentra el par de clusters con la menor distancia y mézclalos en un solo cluster.

    4. Elimina los clusters fusionados de la lista y agrega el nuevo cluster a la lista.

    5. Repite los pasos 2-4 hasta que solo queden dos clusters.

    6. Asigna cada observación en el dataframe al cluster más cercano basado en el agrupamiento final.

    Aquí tienes un ejemplo de cómo podrías implementarlo:

    import pandas as pd
    import numpy as np
    
    # Carga tu dataframe aquí
    df = pd.read_csv('tu_archivo.csv')
    
    # Calcula las distancias entre todas las observaciones
    dist_matrix = np.zeros((len(df), len(df)))
    for i in range(len(df)):
        for j in range(i+1, len(df)):
            dist = calcular_distancia(df.loc[i], df.loc[j])
            dist_matrix[i, j] = dist_matrix[j, i] = dist
    
    # Inicializa la lista de clusters
    clusters = [[i] for i in range(len(df))]
    
    # Realiza el agrupamiento jerárquico
    while len(clusters) > 2:
        # Calcula las distancias entre todos los clusters
        cluster_dist = np.zeros((len(clusters), len(clusters)))
        for i in range(len(clusters)):
            for j in range(i+1, len(clusters)):
                dist = calcular_distancia_cluster(clusters[i], clusters[j], dist_matrix)
                cluster_dist[i, j] = cluster_dist[j, i] = dist
    
        # Encuentra el par de clusters con menor distancia
        i, j = np.unravel_index(np.argmin(cluster_dist), cluster_dist.shape)
    
        # Fusiona los clusters i y j
        clusters[i] = clusters[i] + clusters[j]
        del clusters[j]
    
    # Asigna cada observación a su cluster basado en el agrupamiento final
    asignaciones_clusters = np.zeros(len(df))
    for i, c in enumerate(clusters):
        for j in c:
            asignaciones_clusters[j] = i
    
    # Imprime las asignaciones finales de clusters
    print(asignaciones_clusters)
    

    Espero que esto te ayude. Hazme saber si tienes alguna pregunta adicional.

Comments are closed.