Es gibt drei Schritte in hierarchisch angehäuften Bündelung (HAC):
- Quantify Daten (
metric
Argument)
- Cluster-Daten (
method
Argument)
- 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-
metric = 'euclidean'
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
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
@ 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
@ 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