2017-12-07 4 views
0

Ich habe ein Problem mit dem Hierarchie-Paket in SciPy. Hier gibt es ein Beispiel dafür, was meine Distanzmatrix ist:Hierarchisches Clustering mit SciPy: Merge die Punkte mit der größten Entfernung zuerst

[[ 0., 40., 33., 28.], 
[ 40., 0., 35., 28.], 
[ 33., 35., 0., 28.], 
[ 28., 28., 28., 0.]] 

ich die Matrix in einen Vektor transformieren, und ich möchte eine Hierarchie, die den höchsten Wert in der Matrix übergeht, so sollte es in Ordnung verschmelzen ((0- 1) -2) -3). Dazu benutze ich den 'complete' Parameter, wie er in der Dokumentation geschrieben ist, dass damit das Maximum genommen wird, aber es erzeugt tatsächlich: ((0-3) -2) -1)

Dies ist der code, der die verknüpfungsmatrix berechnet:

Z = linkage(distArray, 'complete') 

Irgendwelche Ratschläge?

+0

FYI: Das erste Argument für 'linkage' muss entweder das 1-D Array von * condensed * (aka * compressed *) Distanzdaten sein (siehe zB https://stackoverflow.com/questions/13079563/how- does-condensed-distance-matrix-work-pdist/13079806 # 13079806) oder das ursprüngliche Array von Punkten. Um ein symmetrisches Distanz-Array in die komprimierte Form zu konvertieren, verwenden Sie 'squareform (distArray)', wobei 'squareform' aus' scipy.spatial.distance' importiert wird. –

Antwort

1

Sie haben die Bedeutung der "vollständigen" Methode missverstanden. Es bedeutet nur, dass der Abstand zwischen zwei Punktclustern, z. B. {A, B} und {C, D}, als das Maximum der paarweisen Abstände AC, AD, BC, BD genommen wird. Dies ändert nichts an der Tatsache, dass hierarchisches Clustering Cluster in der Nähe von Cluster mit dem geringsten Abstand voneinander kombiniert. Es gibt keine Clustering-Methode für "kombinieren Punkte, wenn sie sehr weit voneinander entfernt sind".

Wenn Sie große Einträge in Ihrer Entfernungsmatrix (nennen wir D) wollen, die heißen "diese sind ähnlich", dann müssen Sie D transformieren, um die Ordnungsrelation zwischen den Entfernungen zu invertieren. Mit anderen Worten, die Matrix misst die Ähnlichkeit von Objekten und Sie benötigen ein Maß von Dis Ähnlichkeit.

Am einfachsten ist es, das Zeichen zu ändern; linkage erfordert eigentlich keine Abstände, um positiv zu sein.

from scipy.cluster.hierarchy import linkage 
from scipy.spatial.distance import squareform 

linkage(-squareform(D), 'complete') 

kehrt

array([[ 0., 1., -40., 2.], 
     [ 2., 4., -33., 3.], 
     [ 3., 5., -28., 4.]]) 

Gestänge ((0-1) -2) -3.

Wenn negative Werte ein Problem sind, gibt es andere Transformationen, die nicht produzieren negative Zahlen:

linkage(D.max() - squareform(D), 'complete') 

oder

linkage(squareform(D)**(-1), 'complete') 

All dies wird die gleiche Hierarchie zurückkehren, solange ‚vollständig "ist die Methode".

Nun, da Sie wissen, dass "vollständig" nicht unbedingt das ist, was Sie brauchen, können Sie auch andere Methoden in Erwägung ziehen, und dann kann der Effekt der Transformation auf D das Ergebnis verändern. Machen Sie das, was in Ihrem Kontext Sinn macht, wenn Sie bedenken, was D tatsächlich darstellt.

+0

Ich habe die Beziehung invertiert und alles funktioniert gut. Ich denke jedoch, dass die Verknüpfungsmatrix positive Zahlen erfordert, da sie sich oft über negative Werte beschwert. –

+0

Es hat sich in diesem Beispiel nicht für mich beklagt, aber wenn es das tut, würde das Subtrahieren von D von 'D.max()' das beheben. Zu der Antwort hinzugefügt. – FTP

Verwandte Themen