2017-11-28 6 views
0

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_treeis 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?

Antwort

2

Nicht sicher, wie man hier die richtige Anzahl von Clustern aus fcluster bekommt.

Als Alternative Scikit-Learn hat AgglomerativeClustering:

from sklearn.cluster import AgglomerativeClustering 

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

    print("\nValues from AgglomerativeClustering:\n{}".format(AgglomerativeClustering(n_clusters=n_clust, affinity='euclidean', linkage='average').fit(df.T.values).labels_)) 

, die die richtige Anzahl von Clustern für die bereitgestellten Datensatzes zurückgibt (wenn auch in anderer Reihenfolge):

Values from flcuster: 
[1 1 1 1] 

Values from cut_tree: 
[[0 0 0 0]] 

Values from AgglomerativeClustering: 
[0 0 0 0] 
-------- 
Values from flcuster: 
[1 1 1 2] 

Values from cut_tree: 
[[0 0 0 1]] 

Values from AgglomerativeClustering: 
[0 0 0 1] 
-------- 
Values from flcuster: 
[1 1 1 2] 

Values from cut_tree: 
[[0 0 1 2]] 

Values from AgglomerativeClustering: 
[0 0 2 1] 
-------- 
Values from flcuster: 
[1 1 1 2] 

Values from cut_tree: 
[[0 1 2 3]] 

Values from AgglomerativeClustering: 
[3 1 2 0] 
+0

für alle die großen Werke Fälle, die ich getestet habe, danke! – Cleb

Verwandte Themen