2015-10-08 12 views
5

Ich habe eine Ähnlichkeitsmatrix zwischen vier Benutzern. Ich möchte eine agglomerative Clusterbildung durchführen. der Code wie folgt aus:sklearn agglomerative Clustering Eingangsdaten

lena = np.matrix('1 1 0 0;1 1 0 0;0 0 1 0.2;0 0 0.2 1') 
X = np.reshape(lena, (-1, 1)) 

print("Compute structured hierarchical clustering...") 
st = time.time() 
n_clusters = 3 # number of regionsle 


ward = AgglomerativeClustering(n_clusters=n_clusters, 
     linkage='complete').fit(X) 
print ward 
label = np.reshape(ward.labels_, lena.shape) 
print("Elapsed time: ", time.time() - st) 
print("Number of pixels: ", label.size) 
print("Number of clusters: ", np.unique(label).size) 
print label 

das Druckergebnis des Etiketts ist wie:

[[1 1 0 0] 
[1 1 0 0] 
[0 0 1 2] 
[0 0 2 1]] 

Bedeutet das, es ein Listen möglicher Cluster Ergebnis ergibt, können wir eine von ihnen wählen? wie die Wahl von: [0,0,2,1]. Wenn es falsch ist, könnten Sie mir sagen, wie man den agglomerativen Algorithmus basierend auf Ähnlichkeit durchführt? Wenn es richtig ist, ist die Ähnlichkeitsmatrix riesig, wie kann ich das optimale Clusterergebnis aus einer riesigen Liste auswählen?

Dank

Antwort

1

Ich denke, das Problem hier ist, dass Sie Ihr Modell mit den falschen Daten passen

# This will return a 4x4 matrix (similarity matrix) 
lena = np.matrix('1 1 0 0;1 1 0 0;0 0 1 0.2;0 0 0.2 1') 

# However this will return 16x1 matrix 
X = np.reshape(lena, (-1, 1)) 

Das wahre Ergebnis, das Sie erhalten, ist dies:

ward.labels_ 
>> array([1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 2, 0, 0, 2, 1]) 

, die das Etikett jedes Element ist in der X-Vektor und es macht nicht sens

Wenn ich Ihr Problem gut verstanden habe, müssen Sie Ihre Benutzer nach Entfernung zwischen ihnen zu klassifizieren (Ähnlichkeit). Nun, in diesem Fall werde ich vorschlagen, Spektralclustering auf diese Weise zu verwenden:

import numpy as np 
from sklearn.cluster import SpectralClustering 

lena = np.matrix('1 1 0 0;1 1 0 0;0 0 1 0.2;0 0 0.2 1') 

n_clusters = 3 
SpectralClustering(n_clusters).fit_predict(lena) 

>> array([1, 1, 0, 2], dtype=int32) 
+0

Aber was, wenn er ein hierarchisches Clustering benötigt? – Itay