web-dev-qa-db-fra.com

Tutoriel pour scipy.cluster.hierarchy

J'essaie de comprendre comment manipuler un cluster de hiérarchie mais la documentation est trop ... technique? ... et je ne comprends pas comment cela fonctionne.

Y a-t-il un tutoriel qui peut m'aider à commencer, expliquant étape par étape quelques tâches simples?

Disons que j'ai l'ensemble de données suivant:

a = np.array([[0,   0  ],
              [1,   0  ],
              [0,   1  ],
              [1,   1  ], 
              [0.5, 0  ],
              [0,   0.5],
              [0.5, 0.5],
              [2,   2  ],
              [2,   3  ],
              [3,   2  ],
              [3,   3  ]])

Je peux facilement faire le cluster de hiérarchie et tracer le dendrogramme:

z = linkage(a)
d = dendrogram(z)
  • Maintenant, comment puis-je récupérer un cluster spécifique? Disons celui avec des éléments [0,1,2,4,5,6] dans le dendrogramme?
  • Comment récupérer les valeurs de ces éléments?
33
user2988577

Le clustering agglomératif hiérarchique (HAC) comporte trois étapes:

  1. Quantifier les données (argument metric)
  2. Données de cluster (argument method)
  3. Choisissez le nombre de clusters

Faire

z = linkage(a)

accomplira les deux premières étapes. Comme vous n'avez spécifié aucun paramètre, il utilise les valeurs standard

  1. metric = 'euclidean'
  2. method = 'single'

Donc, z = linkage(a) vous donnera un seul cluster d'agglomération hiérarchique lié de a. Ce clustering est une sorte de hiérarchie de solutions. De cette hiérarchie, vous obtenez des informations sur la structure de vos données. Ce que vous pourriez faire maintenant, c'est:

  • Vérifiez quelle metric est appropriée, e. g. cityblock ou chebychev quantifiera vos données différemment (cityblock, euclidean et chebychev correspondent à L1, L2 Et la norme L_inf)
  • Vérifiez les différentes propriétés/comportements des methdos (par ex. single, complete et average)
  • Vérifiez comment déterminer le nombre de clusters, e. g. par en lisant le wiki à ce sujet
  • Calculer des indices sur les solutions trouvées (regroupements) tels que coefficient de silhouette (avec ce coefficient, vous obtenez un retour sur la qualité de l'adéquation d'un point/observation au cluster auquel il est affecté par le clustering). ). Différents indices utilisent différents critères pour qualifier un clustering.

Voici quelque chose pour commencer

import numpy as np
import scipy.cluster.hierarchy as hac
import matplotlib.pyplot as plt


a = np.array([[0.1,   2.5],
              [1.5,   .4 ],
              [0.3,   1  ],
              [1  ,   .8 ],
              [0.5,   0  ],
              [0  ,   0.5],
              [0.5,   0.5],
              [2.7,   2  ],
              [2.2,   3.1],
              [3  ,   2  ],
              [3.2,   1.3]])

fig, axes23 = plt.subplots(2, 3)

for method, axes in Zip(['single', 'complete'], axes23):
    z = hac.linkage(a, method=method)

    # Plotting
    axes[0].plot(range(1, len(z)+1), z[::-1, 2])
    knee = np.diff(z[::-1, 2], 2)
    axes[0].plot(range(2, len(z)), knee)

    num_clust1 = knee.argmax() + 2
    knee[knee.argmax()] = 0
    num_clust2 = knee.argmax() + 2

    axes[0].text(num_clust1, z[::-1, 2][num_clust1-1], 'possible\n<- knee point')

    part1 = hac.fcluster(z, num_clust1, 'maxclust')
    part2 = hac.fcluster(z, num_clust2, 'maxclust')

    clr = ['#2200CC' ,'#D9007E' ,'#FF6600' ,'#FFCC00' ,'#ACE600' ,'#0099CC' ,
    '#8900CC' ,'#FF0000' ,'#FF9900' ,'#FFFF00' ,'#00CC01' ,'#0055CC']

    for part, ax in Zip([part1, part2], axes[1:]):
        for cluster in set(part):
            ax.scatter(a[part == cluster, 0], a[part == cluster, 1], 
                       color=clr[cluster])

    m = '\n(method: {})'.format(method)
    plt.setp(axes[0], title='Screeplot{}'.format(m), xlabel='partition',
             ylabel='{}\ncluster distance'.format(m))
    plt.setp(axes[1], title='{} Clusters'.format(num_clust1))
    plt.setp(axes[2], title='{} Clusters'.format(num_clust2))

plt.tight_layout()
plt.show()

Donne enter image description here

62
embert