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?
clustering
scikit-learn
text-mining
dbscan
Filamente
quelle
quelle
Antworten:
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.
quelle
sklearn