k-bedeutet Implementierung mit benutzerdefinierter Distanzmatrix in der Eingabe


14

Kann mich jemand auf eine k-means-Implementierung hinweisen (besser in matlab), die die Distanzmatrix als Eingabe verwenden kann? Die Standard-Matlab-Implementierung benötigt die Beobachtungsmatrix als Eingabe und es ist nicht möglich, das Ähnlichkeitsmaß benutzerdefiniert zu ändern.


2
Sie könnten versuchen, Rohdaten zu generieren, die Ihrer Matrix aus euklidischen Abständen entsprechen, und diese in K-Means eingeben. Ein alternativer einfacher Ansatz könnte darin bestehen, die Ward-Methode der hierarchischen Gruppierung der Matrix zu verwenden: K-Means und Ward teilen eine ähnliche Ideologie dessen, was ein Cluster ist.
TTNPHNS

Zusätzlich zu ttnphns und Not Durrett finden Sie möglicherweise Ist es in Ordnung , Manhattan-Distanz mit der Cluster-Verknüpfung von Ward in hierarchischen Clustern zu verwenden? interessant
steffen

Nicht Matlab, aber die Seite von Python unter ist es möglich, Ihre eigene Entfernungsfunktion mit Hilfe von Scikits anzugeben. Learn-k-means kann jede der 20 ungeraden Metriken in scipy.spatial verwenden. Entfernung.
Denis

Antworten:


13

Da k-means in der Lage sein muss, die Mittelwerte verschiedener Teilmengen der Punkte zu finden, die Sie gruppieren möchten, ist es nicht sinnvoll, nach einer Version von k-means zu fragen, die eine Distanzmatrix als Eingabe verwendet.

Sie könnten stattdessen k-medoids versuchen . Es gibt einige Matlab-Implementierungen .


1
Hallo, danke für die Antwort; Wäre es möglich, anstelle der direkten Angabe der Distanzmatrix eine benutzerdefinierte Distanzmetrik als Eingabe anzugeben? Der Punkt ist, dass ich zwei Clustering-Methoden vergleichen muss und, da ich in der zweiten eine benutzerdefinierte Ähnlichkeitsmatrix verwende, denselben Ansatz mit kmeans verwenden möchte, um einen fairen Vergleich zu erhalten.
Eugenio

2
Mit ELKI können Sie beliebige Abstandsfunktionen mit k-Mitteln verwenden. Beachten Sie, dass der Algorithmus dann möglicherweise nicht konvergiert. K-Mittel sind wirklich entworfen für quadratischen euklidischen Abstand (Summe der Quadrate). Bei anderen Entfernungen kann es sein, dass der Mittelwert nicht mehr optimiert wird und der Algorithmus irgendwann nicht mehr konvergiert. Im Ernst, erwägen Sie die Verwendung von k-Medoiden. Es wurde tatsächlich geschrieben, um die Verwendung der k-means-Idee mit beliebigen Abständen zu ermöglichen.
Hat aufgehört - Anony-Mousse

Es gibt auch eine Python / C ++ - Bibliothek, mit der Sie eine benutzerdefinierte
Metrikfunktion bereitstellen

7

Sie können Ihre Entfernungsmatrix in Rohdaten umwandeln und diese in das K-Means-Clustering eingeben. Die Schritte wären wie folgt:

1) Die Abstände zwischen Ihren N Punkten müssen euklidisch quadriert werden. Führen Sie eine " doppelte Zentrierung " der Matrix durch: Subtrahieren Sie den Zeilenmittelwert von jedem Element. im Ergebnis wird der Mittelwert der Spalte von jedem Element abgezogen; Addieren Sie im Ergebnis den Mittelwert der Matrix zu jedem Element. Teilen Sie durch minus 2. Die Matrix, die Sie jetzt haben, ist die SSCP-Matrix (Summe aus Quadraten und Kreuzprodukt) zwischen Ihren Punkten, wobei der Ursprung am geometrischen Mittelpunkt der Wolke aus N Punkten liegt. (Lesen Erklärung der Doppelzentrierung hier .)

2) Führen PCA (Hauptkomponentenanalyse) und auf dieser Matrix erhalten NxN Komponente Lade Matrix. Einige der letzten Spalten davon sind wahrscheinlich alle 0, - schneiden Sie sie ab. Bei dem, was Sie jetzt behalten, handelt es sich tatsächlich um Hauptkomponenten-Scores, die Koordinaten Ihrer N-Punkte auf Hauptkomponenten, die als Achsen durch Ihre Cloud verlaufen. Diese Daten können als Rohdaten behandelt werden, die für die K-Means-Eingabe geeignet sind.

PS Wenn Ihre Abstände nicht geometrisch korrekt sind, können Sie auf ein Problem stoßen: Die SSCP-Matrix ist möglicherweise nicht positiv (semidefinit). Dieses Problem kann auf verschiedene Arten, jedoch mit Genauigkeitsverlust, bewältigt werden.


Danke für deine Antwort! Eigentlich habe ich keine reale Entfernungsmatrix, sondern eine Ähnlichkeitsmatrix (0 ... 1) zwischen Objekten, und die Ähnlichkeiten werden nicht exakt mit euklidischen Entfernungen berechnet, sondern mit einem benutzerdefinierten Algorithmus, der die Rohdaten berücksichtigt, jedoch nicht in der Standard Weg. Ich schätze in diesem Fall kann ich Ihr Verfahren nicht anwenden, habe ich recht?
Eugenio

Sie können immer noch Ähnlichkeiten in Entfernungen umwandeln. Letzteres wird wahrscheinlich nicht euklidisch sein (und so wird der SSCP einige negative Eigenwerte haben); Versuchen Sie dann, eine kleine Konstante zu den Entfernungen hinzuzufügen, bis der SSCP neg verliert. eig. Es gibt auch andere Möglichkeiten, um das Problem zu umgehen. Und bitte denken Sie daran, dass Sie die Matrix der quadratischen Abstände verdoppeln .
TTNPHNS

PS Und übrigens. Wenn Ihre Matrix Ähnlichkeiten aufweist, ist sie sogar noch besser. Sie behandeln es einfach als die SSCP-Matrix, über die ich gesprochen habe, und führen PCA damit durch. Dennoch bleibt das Problem möglicher negativer Eigenwerte bestehen.
TTNPHNS

@ttnphns, sorry Ich vermisse Ihre Erklärung für Schritt 1. Die Distanzmatrix X(sagen wir mal N * N) symmetrisch sein wird, so , colMeans(X) =rowMeans(X) und wenn Sie subtrahieren Zeile oder Spalte bedeutet: Y=X-rowMeans(X), mean(Y)ist 0.
Zhubarb

1
@Zhubarb, wenn ich sage You could turn your matrix of distances into raw data(Punkte 1 und 2), beziehe ich mich im Wesentlichen auf Torgersons mehrdimensionale Skalierung (MDS) , bei der die doppelte Zentrierung der erste Schritt ist. Bitte durchsuchen Sie diese Website (und auch Google) nach Informationen zu diesem Vorgang. "Doppelte Zentrierung" ist die Umwandlung von (quadratischen) Abständen in die entsprechende Skalarproduktmatrix, die über dem Ursprung definiert ist, der in den Schwerpunkt der Punktwolke eingetragen ist.
ttnphns

3

Bitte beachten Sie diesen Artikel, der von einem meiner Bekannten verfasst wurde;)

http://arxiv.org/abs/1304.6899

Es handelt sich um eine verallgemeinerte k-Means-Implementierung, die eine beliebige Distanzmatrix als Eingabe verwendet. Es kann sich um eine beliebige symmetrische nichtnegative Matrix mit einer Nulldiagonale handeln. Beachten Sie, dass es für seltsame Entfernungsmatrizen möglicherweise keine vernünftigen Ergebnisse gibt. Das Programm ist in C # geschrieben.

Der Quellcode kann über den obigen Link abgerufen werden, indem Sie auf Andere Formate und dann auf Quelle herunterladen klicken. Dann erhalten Sie eine .tar.gz mit Program.cs. Alternativ kann der Quellcode auch aus dem PDF kopiert werden.


3

Sie können die Java Machine Learning Library verwenden. Sie haben eine K-Means-Implementierung. Einer der Konstruktoren akzeptiert drei Argumente

  1. K-Wert.
  2. Ein Objekt davon ist eine Instanz der DistanceMeasure- Klasse.
  3. Anzahl der Iterationen.

Sie können die DistanceMeasure-Klasse problemlos erweitern, um das gewünschte Ergebnis zu erzielen. Die Idee ist, Werte aus einer benutzerdefinierten Distanzmatrix in der Measure-Methode (Instanz x, Instanz y) dieser Klasse zurückzugeben.

Es ist garantiert, dass K-Means unter Annahme bestimmter Eigenschaften der Abstandsmetrik konvergiert. Euklidische Entfernung, Manhattan-Entfernung oder andere Standardmetriken erfüllen diese Annahmen. Da eine benutzerdefinierte Distanzmetrik diese Annahmen möglicherweise nicht erfüllt, verfügt der Konstruktor über einen dritten Parameter, der die Anzahl der Iterationen angibt, die zum Erstellen des Clusterers ausgeführt werden sollen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.