Warum werden die meisten meiner Punkte mit DBSCAN als Rauschen eingestuft?


7

Ich verwende mehrere Clustering-Algorithmen von sklearn, um einige Daten zu clustern, und kann anscheinend nicht herausfinden, was mit DBSCAN passiert. Meine Daten sind eine Dokument-Term-Matrix von TfidfVectorizer mit einigen hundert vorverarbeiteten Dokumenten.

Code:

tfv = TfidfVectorizer(stop_words=STOP_WORDS, tokenizer=StemTokenizer())
data = tfv.fit_transform(dataset)

db = DBSCAN(eps=eps, min_samples=min_samples)
result = db.fit_predict(data)
svd = TruncatedSVD(n_components=2).fit_transform(data)
// Set the colour of noise pts to black
for i in range(0,len(result)):
        if result[i] == -1:
            result[i] = 7
colors = [LABELS[l] for l in result]
pl.scatter(svd[:,0], svd[:,1], c=colors, s=50, linewidths=0.5, alpha=0.7)

Folgendes bekomme ich für eps = 0.5, min_samples = 5:

Grundsätzlich kann ich überhaupt keine Cluster erhalten, es sei denn, ich setze min_samples auf 3, was Folgendes ergibt:

Ich habe verschiedene Kombinationen von eps / min_samples-Werten ausprobiert und ähnliche Ergebnisse erzielt. Es scheint immer zuerst Bereiche mit geringer Dichte zu gruppieren. Warum gruppiert es sich so? Benutze ich TruncatedSVD möglicherweise falsch?


Willkommen bei Cross Validated ! Bitte nehmen Sie sich einen Moment Zeit, um unsere Tour anzusehen .
Tavrock

Die Streudiagramme zeigen keinen Trend, aber es kann sein, dass die Varianz nicht konstant ist.
Michael R. Chernick

1
@ MichaelChernick: Dieser Kommentar scheint fehl am Platz zu sein. Was meinst du mit Trend und warum interessiert uns das in dieser Clustering-Anwendung? Wenn überhaupt, zeigt die Streuung der ersten beiden PC-Scores einen offensichtlichen Cluster. DBSCAN untersucht nicht innerhalb der Clustervarianz oder ähnliches ...
usεr11852

2
Beachten Sie, dass Sie hier wahrscheinlich DBSCAN mit Kosinusabstand anstelle des euklidischen Abstands verwenden sollten.
Hat aufgehört - Anony-Mousse

Antworten:


5

Das Streudiagramm der SVD-Projektionswerte der ursprünglichen TFIDF- Daten legt nahe, dass tatsächlich eine gewisse Dichtestruktur erfasst werden sollte. Trotzdem sind diese Daten nicht die Eingaben, mit denen DBSCAN dargestellt wird. Anscheinend verwenden Sie als Eingabe die ursprünglichen TFIDF- Daten.

Es ist sehr plausibel, dass der ursprüngliche TFIDF-Datensatz spärlich und hochdimensional ist. Das Erkennen von dichtebasierten Clustern in einer solchen Domäne wäre sehr anspruchsvoll. Die Schätzung der hochdimensionalen Dichte ist ein richtig schwieriges Problem. Es ist ein typisches Szenario, in dem der Fluch der Dimensionalität einsetzt . Wir sehen nur eine Manifestation dieses Problems ("Fluch"). Das resultierende Clustering, das von DBSCAN zurückgegeben wird, ist selbst eher spärlich und geht (wahrscheinlich zu Unrecht) davon aus, dass die vorliegenden Daten mit Ausreißern durchsetzt sind.

Ich würde vorschlagen, dass DBSCAN zumindest in erster Instanz mit den Projektionswerten versehen wird, die zum Erstellen des als Eingaben angezeigten Streudiagramms verwendet werden. Dieser Ansatz wäre effektiv Latent Semantic Analysis (LSA). In LSA verwenden wir die SVD-Zerlegung einer Matrix, die Wortzahlen des analysierten Textkorpus enthält (oder einer normalisierten Term-Dokument-Matrix, wie sie von TFIDF zurückgegeben wurde), um die Beziehungen zwischen den Texteinheiten des vorliegenden Korpus zu untersuchen.


Und wie @Tavrock sagte, willkommen in der Community! : D
usεr11852

Ja, ich habe die ursprünglichen TFIDF-Daten verwendet. Die Cluster von DBSCAN scheinen vernünftig zu sein, wenn Sie dies mit denselben Daten in R versuchen, daher habe ich nicht erwartet, dass es mit sklearn viel anders sein würde. K-means (mit sklearn) funktioniert auch gut mit den TFIDF-Daten. Ist es sinnvoll, dass es mit diesen anderen Dingen funktioniert, aber nicht für diese spezielle DBSCAN-Implementierung? Vielen Dank für die Informationen zu LSA. Ich war mir überhaupt nicht sicher, wann es gültig war, die SVD-Werte für die Anpassung der Modelle im Vergleich zur Verwendung der TFIDF-Daten zu verwenden.
Filamente

Großartig, ich bin froh, dass ich helfen konnte. Wenn Sie glauben, dass dieser Beitrag Ihre Frage beantwortet, können Sie die Antwort akzeptieren. bedeutet, dass (wahrscheinlich) ein Cluster gefunden werden konnte, da es für den Radius seines Clusters nicht direkt von einem ähnlichen Faktor wie DBSCAN abhängt . Das bedeutet jedoch nicht, dass das Clustering sinnvoll ist. Ich habe die Python DBSCAN-Implementierung der Version nicht verwendet , daher kann ich deren Qualität nicht kommentieren. Beachten Sie jedoch, dass einige Implementierungen möglicherweise Standardvorverarbeitungsschritte ausführen und die Leistung bei Anwendung versehentlich beeinträchtigen. kϵsklearn
usεr11852
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.