wake-up-neo.com

Tutorial für scipy.cluster.hierarchy

Ich versuche zu verstehen, wie man einen Hierarchiecluster manipuliert, aber die Dokumentation ist zu ... technisch? ... und ich kann nicht verstehen, wie es funktioniert.

Gibt es ein Tutorial, mit dem ich anfangen kann und das einige einfache Aufgaben Schritt für Schritt erklärt?

Angenommen, ich habe den folgenden Datensatz:

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 den Hierarchie-Cluster erstellen und das Dendrogramm zeichnen:

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

Das hierarchische agglomerative Clustering (HAC) besteht aus drei Schritten:

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

Tun

z = linkage(a)

führt die ersten beiden Schritte aus. Da Sie keine Parameter angegeben haben, werden die Standardwerte verwendet

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

Mit z = linkage(a) erhalten Sie eine einzelne verknüpfte hierachische agglomerative Gruppierung von a. Dieses Clustering ist eine Art Hierarchie von Lösungen. Aus dieser Hierarchie erhalten Sie einige Informationen über die Struktur Ihrer Daten. Was Sie jetzt tun könnten, ist:

  • Überprüfen Sie, welches metric geeignet ist, e. G. cityblock oder chebychev quantifizieren Ihre Daten unterschiedlich (cityblock, euclidean und chebychev entsprechen L1, L2 Und L_inf Norm)
  • Überprüfen Sie die verschiedenen Eigenschaften/Verhaltensweisen von methdos (z. B. single, complete und average)
  • Überprüfen Sie, wie Sie die Anzahl der Cluster ermitteln können, z. G. von lese das Wiki darüber
  • Berechnen Sie Indizes für die gefundenen Lösungen (Clustering), z. B. Schattenkoeffizient (mit diesem Koeffizienten erhalten Sie ein Feedback zur Qualität, wie gut ein Punkt/eine Beobachtung zu dem Cluster passt, dem/der es durch das Clustering zugewiesen wird ). Unterschiedliche Indizes verwenden unterschiedliche Kriterien, um ein Clustering zu qualifizieren.

Hier ist etwas zu beginnen

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

62
embert