Clustering mit Kosinusähnlichkeit

8

Ich habe einen großen Datensatz und eine Kosinusähnlichkeit zwischen ihnen. Ich möchte sie mit Cosinus-Ähnlichkeit gruppieren, die ähnliche Objekte zusammenfügt, ohne vorher die Anzahl der erwarteten Cluster angeben zu müssen.

Ich habe die sklearn-Dokumentation von DBSCAN und Affinity Propagation gelesen, in der beide eine Distanzmatrix (keine Kosinus-Ähnlichkeitsmatrix) benötigen.

Wirklich, ich suche nur nach einem Algorithmus, der nicht a) eine Entfernungsmetrik und b) eine vorgegebene Anzahl von Clustern erfordert .

Kennt jemand einen Algorithmus, der das tun würde?

Smith Volka
quelle

Antworten:

8

Erstens verwendet jeder Clustering-Algorithmus eine Art Distanzmetrik. Was eigentlich wichtig ist, weil jede Metrik ihre eigenen Eigenschaften hat und für verschiedene Arten von Problemen geeignet ist.

Sie sagten, Sie haben eine Kosinusähnlichkeit zwischen Ihren Datensätzen, dies ist also tatsächlich eine Distanzmatrix. Sie können diese Matrix als Eingabe für einen Clustering-Algorithmus verwenden.

Jetzt würde ich vorschlagen, mit hierarchischem Clustering zu beginnen - es ist keine definierte Anzahl von Clustern erforderlich, und Sie können entweder Daten eingeben und eine Entfernung auswählen oder eine Entfernungsmatrix eingeben (in der Sie die Entfernung auf irgendeine Weise berechnet haben).

Beachten Sie, dass die Berechnung des hierarchischen Clusters teuer ist. Wenn Sie also über viele Daten verfügen, können Sie mit nur einer Stichprobe beginnen.

HonzaB
quelle
Danke für die nützliche Antwort. Ich habe ein ähnliches Problem wie dieses datascience.stackexchange.com/questions/20198 und möchte die darin angegebene Antwort verwenden. Um jedoch die dem Schwerpunkt am nächsten gelegenen Punkte zu finden, verwendet er den minimalen Kosinusabstand. Wenn ich Kosinusähnlichkeit verwende, wäre dies die höchste Kosinusähnlichkeit?
Smith Volka
1
Sie können den Abstand einfach in Ähnlichkeit umwandeln. Wenn der Abstand von A nach B 0,3 beträgt, beträgt die Ähnlichkeit 1-0,3 = 0,7.
HonzaB
3

DBSCAN kann trivial mit einem Ähnlichkeitsmaß anstelle einer Entfernung implementiert werden. Sie müssen nur das <= Epsilon in ein> = Epsilon ändern.

HAC funktioniert auch gut mit Ähnlichkeiten (mindestens Single-Link, Complete-Link, UPGMA, WPGMA - verwenden Sie nicht Ward), wenn Sie "min" und "max" tauschen (Sie möchten mit maximaler Ähnlichkeit und nicht mit minimaler Ähnlichkeit zusammenführen Entfernung).

Wenn Sie faul sind, können Sie Ihre Ähnlichkeit auch einfach in eine Distanz verwandeln. Wenn Sie ein festes Maximum haben, reicht dist = max-sim oft aus.

Hat aufgehört - Anony-Mousse
quelle
Danke für die Antwort. Was meinte ypu mit epsilon in <= epsilon in a> = epsilon?
Smith Volka
Ok, der Standardwert von eps in sklearn ist 0,5. Ist es richtig, wenn ich diesen Wert erhöhe (zB 0,8)? Ist es das, was du in deiner Antwort gemeint hast?
Smith Volka
DBSCAN verwendet einen maximalen Epsilon-Entfernungsschwellenwert. Mit GDBSCAN können Sie stattdessen auch eine minimale Ähnlichkeit verwenden. Sie müssen den Code ändern, nicht den Parameter . Sklearn unterstützt keine Ähnlichkeit. ELKI unterstützt direkt Ähnlichkeitsfunktionen in GDBSCAN über SimilarityNeighborPredicate.
Hat aufgehört - Anony-Mousse
Wenn Sie nicht codieren können, können Sie den von mir erwähnten "faulen" Ansatz ausführen. Es sollte die gleichen Ergebnisse geben.
Hat aufgehört - Anony-Mousse
Was meinst du mit Wenn du ein festes Maximum hast, reicht dist = max-sim oft aus? Ich bin daran interessiert, es zu versuchen.
Smith Volka
3

Ich würde das hierarchische Clustering von sklearn verwenden

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from scipy.cluster import  hierarchy

#Vectorizing
X = CountVectorizer().fit_transform(docs)
X = TfidfTransformer().fit_transform(X)
#Clustering
X = X.todense()
threshold = 0.1
Z = hierarchy.linkage(X,"average", metric="cosine")
C = hierarchy.fcluster(Z, threshold, criterion="distance")

Cist Ihr Clustering der Dokumente docs.

Sie können stattdessen andere Metriken verwenden cosineund einen anderen Schwellenwert als verwenden0.1

Uri Goren
quelle
Ist "docs" die ursprüngliche Datenmatrix? Wo soll die Datenmatrix oder wo die Kosinus-Ähnlichkeitsmatrix abgelegt werden? danke
Bill Ancalagon der Schwarze
1
docssind die Dokumente, Zist die Kosinus-Ähnlichkeitsmatrix
Uri Goren
3

Ich denke, das clustMixType- Paket könnte Ihnen bessere Ergebnisse / Erkenntnisse liefern.

Wenn Sie dieses Paket verwenden , können Sie die Kombination von kategorialen und numerischen Daten direkt verwenden. Es ist keine Hot-Codierung erforderlich.

Sie müssen nur die Daten eingeben und sie werden automatisch in kategoriale und numerische Daten getrennt. Wenn Sie zum Zeitpunkt der Trennung Probleme feststellen, können Sie Funktionen wie as.factor(to convert to a categorical)und verwenden as.numeric(to convert to a Numeric field).

Sie können Lambda(mean Distance value)vorab berechnen und als Eingabe in den Algorithmus eingeben.

Wenn Sie nicht die optimale Anzahl von Clustern kennen, können Sie verwenden WSS(within Sum of Squares), um plot(elbow chart)die optimale Anzahl von Clustern zu entscheiden.

Toros91
quelle
2

Alle Clustering-Methoden verwenden eine Entfernungsmetrik. Und denken Sie daran, dass die Entfernung im Wesentlichen ein Unähnlichkeitsmaß ist. Wenn Sie also Ihre Ähnlichkeit zwischen 0 und 1 normalisieren, beträgt Ihre Entfernung einfach 1-Ähnlichkeit

Für Algorithmen, für die keine Anzahl von Clustern angegeben werden muss, gibt es natürlich hierarchische Clustering-Techniken, die im Wesentlichen eine baumartige Struktur erstellen, die Sie nach Belieben "schneiden" können (Sie können einige Leistungsmetriken verwenden, um dies automatisch zu tun )

X-means ist eine Version von K-means, die eine bestimmte Anzahl von K versucht und diejenige auswählt, die eine Bewertungsfunktion maximiert.

Die mittlere Verschiebung "findet" auch eine natürliche Anzahl von Clustern, ist jedoch für andere Parameter wie beispielsweise die Bandbreite sinnvoll.

Valentin Calomme
quelle