2014-02-07 6 views
30

Ich versuche zu verstehen, wie ein Hierarchie-Cluster zu manipulieren, aber die Dokumentation ist zu ... technisch? ... und ich kann nicht verstehen, wie es funktioniert.Tutorial für scipy.cluster.hierarchy

Gibt es ein Tutorial, das mir helfen kann, mit einigen einfachen Aufgaben Schritt für Schritt zu erklären?

Lassen Sie uns sagen, dass ich die folgende Datensatz haben:

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 ]]) 

Ich kann leicht die Hierarchie Cluster tun und zeichnen Sie die dendrogram:

z = linkage(a) 
d = dendrogram(z) 
  • Nun, wie ich einen bestimmten Cluster wiederherstellen können ? Sagen wir mal das mit den Elementen [0,1,2,4,5,6] im Dendrogramm?
  • Wie kann ich die Werte dieser Elemente zurückbekommen?

Antwort

51

Es gibt drei Schritte in hierarchisch angehäuften Bündelung (HAC):

  1. Quantify Daten (metric Argument)
  2. Cluster-Daten (method Argument)
  3. Wählen Sie die Anzahl der Cluster

Doing

z = linkage(a) 

wird die ersten beiden Schritte durchführen. Da Sie keine Parameter angegeben haben, verwendet es die Standard-

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

So z = linkage(a) Ihnen eine einzelne verknüpft hierarchische häuften Bündelung von a geben Werten. Dieses Clustering ist eine Art Hierarchie von Lösungen. Aus dieser Hierarchie erhalten Sie Informationen über die Struktur Ihrer Daten. Was Sie jetzt tun könnten, ist:

  • Überprüfen Sie, welche metric ist geeignet, e. G. cityblock oder chebychev werden Ihre Daten unterschiedlich (cityblock, euclidean und chebychev entsprechen L1, L2 und L_inf Norm)
  • Überprüfen Sie die verschiedenen Eigenschaften/Verhaltensweisen des methdos (zB single, complete und average)
  • prüfen quantifizieren, wie man Bestimmen Sie die Anzahl der Cluster, e. G. von reading the wiki about it
  • Berechnen Sie Indizes auf die gefundenen Lösungen (Clusterings) wie die silhouette coefficient (mit diesem Koeffizienten erhalten Sie eine Rückmeldung über die Qualität, wie gut ein Punkt/Beobachtung zu dem Cluster durch die Clustering zugeordnet ist). Verschiedene Indizes verwenden unterschiedliche Kriterien, um ein Clustering zu qualifizieren.

Hier ist etwas zu beginnen mit

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() 

Gibt enter image description here

+0

Können Sie uns erklären, wie die np.diff verwendet wird, um den Kniepunkt zu finden? Warum benutzt du es im zweiten Grad, und was ist die mathematische Interpretation dieses Punktes? – user1603472

+0

@ user1603472 Jede Zahl auf der Abszisse ist eine mögliche Lösung, die aus der entsprechenden Anzahl von Partitionen besteht. Je mehr Partitionen Sie zulassen, desto höher ist natürlich die Homogenität innerhalb der Cluster. Was Sie eigentlich wollen, ist: Geringe Anzahl von Partitionen mit hoher Homogenität (in den meisten Fällen). Deshalb suchst du nach dem "Kniepunkt", d. e. der Punkt * vor * der Entfernungswert "springt" auf einen viel höheren Wert in Bezug auf den Anstieg davor. – embert

+0

@ user1603472 Wenn ich mit Ableitungen diskreter Werte gearbeitet habe, habe ich keinen Unterschied zwischen erstem und zweitem Grad bemerkt. Irgendwie hat es einfach geklappt. Tatsächlich habe ich herausgefunden, dass man die Formel für die Krümmung verwenden kann, um den "stärksten" Kniepunkt zu finden, aber ich meine: Normalerweise muss man den Plot ohnehin durch Betrachten betrachten. Es könnte nur als zusätzliche Orientierung dienen. Dies ist nach [Ellenbogen-Methode] (http://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set#The_Elbow_Method) im Wiki, das ich sagen würde. – embert