Es gibt ein paar verwandte Fragen dazu, die relevanteste ist this question Ich denke.Wie mache ich fcluster, um die gleiche Ausgabe wie cut_tree zurückzugeben?
Lassen Sie uns sagen, dass ich einen Datensatz wie diese haben (sehr zu Demonstrationszwecken vereinfacht):
import numpy as np
import pandas as pd
from scipy.spatial import distance
from scipy.cluster import hierarchy
val = np.array([[0.20288834, 0.80406494, 4.59921579, 14.28184739],
[0.22477082, 1.43444223, 6.87992605, 12.90299896],
[0.22811485, 0.74509454, 3.85198421, 19.22564266],
[0.20374529, 0.73680174, 3.63178517, 17.82544951],
[0.22722696, 0.86113728, 3.00832186, 16.62306058],
[0.25577882, 0.85671779, 3.70655719, 17.49690061],
[0.23018219, 0.68039151, 2.50815837, 15.09039053],
[0.21638751, 1.12455083, 3.56246872, 18.82866991],
[0.26600895, 1.09415595, 2.85300018, 17.93139433],
[0.22369445, 0.73689845, 3.24919113, 18.60914745]])
df = pd.DataFrame(val, columns=["C{}".format(i) for i in range(val.shape[1])])
C0 C1 C2 C3
0 0.202888 0.804065 4.599216 14.281847
1 0.224771 1.434442 6.879926 12.902999
2 0.228115 0.745095 3.851984 19.225643
3 0.203745 0.736802 3.631785 17.825450
4 0.227227 0.861137 3.008322 16.623061
5 0.255779 0.856718 3.706557 17.496901
6 0.230182 0.680392 2.508158 15.090391
7 0.216388 1.124551 3.562469 18.828670
8 0.266009 1.094156 2.853000 17.931394
9 0.223694 0.736898 3.249191 18.609147
ich die Spalten dieser Datenrahmen und damit auch die Anzahl der Cluster I erhalten clustern möchten. In der Regel kann dies mit der cut_tree function erreicht werden.
Allerdings, cut_tree
is broken und daher suchte ich nach Alternativen, die mich zu dem Link am Anfang dieses Beitrags führte, wo es empfohlen wird, fcluster als Alternative zu verwenden.
Problem ist, dass ich nicht sehe, wie man eine genaue Anzahl von Clustern angibt, sondern nur eine maximale Anzahl mit dem maxclust
Argument.
Also für mein einfaches Beispiel von oben ich tun kann:
# number of target cluster
n_clusters = range(1, 5)
for n_clust in n_clusters:
Z = hierarchy.linkage(distance.pdist(df.T.values), method='average', metric='euclidean')
print("--------\nValues from flcuster:\n{}".format(hierarchy.fcluster(Z, n_clust, criterion='maxclust')))
print("\nValues from cut_tree:\n{}".format(hierarchy.cut_tree(Z, n_clust).T))
die druckt
Values from flcuster:
[1 1 1 1]
Values from cut_tree:
[[0 0 0 0]]
--------
Values from flcuster:
[1 1 1 2]
Values from cut_tree:
[[0 0 0 1]]
--------
Values from flcuster:
[1 1 1 2]
Values from cut_tree:
[[0 0 1 2]]
--------
Values from flcuster:
[1 1 1 2]
Values from cut_tree:
[[0 1 2 3]]
Wie man sehen kann fcluster
kehrt 2 verschiedene Cluster maximal während cut_tree
die gewünschte Zahl zurückgibt.
Gibt es eine Möglichkeit, die gleiche Ausgabe für fcluster
für die Zeit zu erhalten, bis der Fehler in cut_tree
behoben ist? Wenn nicht, gibt es noch eine andere gute Alternative in einem anderen Paket?
für alle die großen Werke Fälle, die ich getestet habe, danke! – Cleb