(Dieser Beitrag ist ein Repost einer Frage, die ich gestern gestellt habe (jetzt gelöscht), aber ich habe versucht, die Anzahl der Wörter zu verringern und das, was ich stelle, zu vereinfachen.)
Ich hoffe, Hilfe bei der Interpretation eines von mir erstellten kmeans-Skripts und einer Ausgabe zu erhalten. Dies steht im Zusammenhang mit der Textanalyse. Ich habe dieses Skript erstellt, nachdem ich mehrere Artikel online über Textanalyse gelesen hatte. Ich habe einige von ihnen unten verlinkt.
Beispiel für ein Skript und ein Korpus von Textdaten, auf die ich in diesem Beitrag verweisen werde:
library(tm) # for text mining
## make a example corpus
# make a df of documents a to i
a <- "dog dog cat carrot"
b <- "phone cat dog"
c <- "phone book dog"
d <- "cat book trees"
e <- "phone orange"
f <- "phone circles dog"
g <- "dog cat square"
h <- "dog trees cat"
i <- "phone carrot cat"
j <- c(a,b,c,d,e,f,g,h,i)
x <- data.frame(j)
# turn x into a document term matrix (dtm)
docs <- Corpus(DataframeSource(x))
dtm <- DocumentTermMatrix(docs)
# create distance matrix for clustering
m <- as.matrix(dtm)
d <- dist(m, method = "euclidean")
# kmeans clustering
kfit <- kmeans(d, 2)
#plot – need library cluster
library(cluster)
clusplot(m, kfit$cluster)
Das war's für das Drehbuch. Nachfolgend finden Sie die Ausgabe einiger Variablen im Skript:
Hier ist x, der Datenrahmen x, der in einen Korpus umgewandelt wurde:
x
j
1 dog dog cat carrot
2 phone cat dog
3 phone book dog
4 cat book trees
5 phone orange
6 phone circles dog
7 dog cat square
8 dog trees cat
9 phone carrot cat
Und hier ist die resultierende Dokumentbegriffmatrix dtm:
> inspect(dtm)
<<DocumentTermMatrix (documents: 9, terms: 9)>>
Non-/sparse entries: 26/55
Sparsity : 68%
Maximal term length: 7
Weighting : term frequency (tf)
Terms
Docs book carrot cat circles dog orange phone square trees
1 0 1 1 0 2 0 0 0 0
2 0 0 1 0 1 0 1 0 0
3 1 0 0 0 1 0 1 0 0
4 1 0 1 0 0 0 0 0 1
5 0 0 0 0 0 1 1 0 0
6 0 0 0 1 1 0 1 0 0
7 0 0 1 0 1 0 0 1 0
8 0 0 1 0 1 0 0 0 1
9 0 1 1 0 0 0 1 0 0
Und hier ist die Distanzmatrix d
> d
1 2 3 4 5 6 7 8
2 1.732051
3 2.236068 1.414214
4 2.645751 2.000000 2.000000
5 2.828427 1.732051 1.732051 2.236068
6 2.236068 1.414214 1.414214 2.449490 1.732051
7 1.732051 1.414214 2.000000 2.000000 2.236068 2.000000
8 1.732051 1.414214 2.000000 1.414214 2.236068 2.000000 1.414214
9 2.236068 1.414214 2.000000 2.000000 1.732051 2.000000 2.000000 2.000000
Hier ist das Ergebnis, kfit:
> kfit
K-means clustering with 2 clusters of sizes 5, 4
Cluster means:
1 2 3 4 5 6 7 8 9
1 2.253736 1.194938 1.312096 2.137112 1.385641 1.312096 1.930056 1.930056 1.429253
2 1.527463 1.640119 2.059017 1.514991 2.384158 2.171389 1.286566 1.140119 2.059017
Clustering vector:
1 2 3 4 5 6 7 8 9
2 1 1 2 1 1 2 2 1
Within cluster sum of squares by cluster:
[1] 13.3468 12.3932
(between_SS / total_SS = 29.5 %)
Available components:
[1] "cluster" "centers" "totss" "withinss" "tot.withinss" "betweenss" "size" "iter"
[9] "ifault"
Hier ist die resultierende Handlung:
Ich habe mehrere Fragen dazu:
- Bei der Berechnung meiner Distanzmatrix d (ein Parameter, der bei der kfit-Berechnung verwendet wird) habe ich Folgendes getan :
d <- dist(m, method = "euclidean")
. Ein anderer Artikel, dem ich begegnet bin, hat dies getan :d <- dist(t(m), method = "euclidean")
. Dann, separat zu einer SO-Frage, die ich kürzlich gepostet habe, kommentierte jemand "kmeans sollten in der Datenmatrix ausgeführt werden, nicht in der Entfernungsmatrix!". Vermutlich bedeutet dieskmeans()
, dass m anstelle von d als Eingabe verwendet werden sollte. Von diesen 3 Variationen welche / wer "richtig" ist. Oder unter der Annahme, dass alle auf die eine oder andere Weise gültig sind, was wäre der herkömmliche Weg, um ein erstes Basismodell zu erstellen? - So wie ich es verstehe, werden beim Aufrufen der kmeans-Funktion für d 2 zufällige Zentroide ausgewählt (in diesem Fall k = 2). Dann betrachtet r jede Zeile in d und bestimmt, welche Dokumente welchem Schwerpunkt am nächsten liegen. Wie würde das auf der Grundlage der obigen Matrix d tatsächlich aussehen? Wenn zum Beispiel der erste zufällige Schwerpunkt 1,5 und der zweite 2 war, wie würde dann Dokument 4 zugewiesen werden? In der Matrix d ist doc4 2.645751 2.000000 2.000000, also (in r) Mittelwert (c (2.645751,2.000000,2.000000)) = 2.2. In der ersten Iteration von kmeans in diesem Beispiel wird doc4 dem Cluster mit dem Wert 2 zugewiesen, da er näher an liegt das als zu 1.5. Danach wird der Mittelwert des Clusters als neuer Schwerpunkt neu berechnet und die Dokumente gegebenenfalls neu zugewiesen. Ist das richtig oder habe ich den Punkt völlig verfehlt?
- Was bedeutet "Cluster" in der obigen kfit-Ausgabe? Beispielsweise hat Doc3-Cluster 1 einen Wert von 1,312096. Was ist diese Nummer in diesem Zusammenhang? [Bearbeiten, da ich dies einige Tage nach dem Posten noch einmal betrachte, kann ich sehen, dass es die Entfernung jedes Dokuments zu den endgültigen Cluster-Zentren ist. Die niedrigste Zahl (am nächsten) bestimmt also, welchem Cluster jedes Dokument zugewiesen ist.
- In der obigen kfit-Ausgabe sieht "Clustering-Vektor" so aus, als wäre es genau der Cluster, dem jedes Dokument zugewiesen wurde. OK.
- In der obigen kfit-Ausgabe "Innerhalb der Clustersumme der Quadrate pro Cluster". Was ist das?
13.3468 12.3932 (between_SS / total_SS = 29.5 %)
. Ein Maß für die Varianz innerhalb jedes Clusters, was vermutlich eine niedrigere Zahl bedeutet, impliziert eine stärkere Gruppierung im Gegensatz zu einer spärlicheren. Ist das eine faire Aussage? Was ist mit dem Prozentsatz von 29,5%. Was ist das? Ist 29,5% "gut". Wäre eine niedrigere oder höhere Zahl in jedem Fall von kmeans bevorzugt? Wenn ich mit einer unterschiedlichen Anzahl von k experimentieren würde, wonach würde ich suchen, um festzustellen, ob die zunehmende / abnehmende Anzahl von Clustern die Analyse unterstützt oder behindert hat? - Der Screenshot des Diagramms reicht von -1 bis 3. Was wird hier gemessen? Was ist in diesem Zusammenhang die Nummer 3 im Gegensatz zu Bildung und Einkommen, Größe und Gewicht?
- In der Darstellung der Meldung "Diese beiden Komponenten erklären 50,96% der Punktvariabilität" habe ich hier bereits einige detaillierte Informationen gefunden (falls jemand anderes auf diesen Beitrag stößt - nur um das Verständnis der kmeans-Ausgabe zu verbessern, die hier hinzugefügt werden soll).
Hier sind einige der Artikel, die ich gelesen habe und die mir beim Erstellen dieses Skripts geholfen haben:
quelle
kfit
Funktionsdokumentation verfügbar? Ich habe in dertm
Bibliothek cran.r-project.org/web/packages/tm/tm.pdf nachgesehen und dort keine gefundenkfit
.tdm
; (b) mit Ihrer euklidischen Distanzmatrixd
. Das K-Mittel von SPSS behandelt Eingaben immer als Fälle X-Variablen und gruppiert die Fälle. Als Anfangszentren gebe ich in beiden Analysen die Ausgabezentren Ihrer Analyse ein -cluster means
. Ergebnisse: In Analyse (b), aber nicht in (a) habe ich endgültige Zentren erhalten, die mit den Eingabezentren identisch sind. Das bedeutet, dass K-Mittel in (b) die Cluster-Zentren nicht weiter verbessern konnten, was impliziert, dass Analyse (b) mit der von Ihnen durchgeführten K-Mittel-Analyse übereinstimmt.Antworten:
Um zu verstehen, wie die
kmeans()
Funktion funktioniert, müssen Sie die Dokumentation lesen und / oder den zugrunde liegenden Code überprüfen. Trotzdem bin ich mir sicher, dass es keine Distanzmatrix braucht, ohne sich darum zu kümmern. Sie könnten Ihre eigene Funktion schreiben, um k-Means-Clustering aus einer Distanzmatrix durchzuführen, aber es wäre ein schrecklicher Aufwand.Der k-means-Algorithmus soll über eine Datenmatrix arbeiten, nicht über eine Distanzmatrix. Es werden nur quadratische euklidische Abstände minimiert (vgl. Warum verwendet der k-means Clustering-Algorithmus nur die euklidische Abstandsmetrik? ). Es ist nur sinnvoll, wenn Sie euklidische Entfernungen als aussagekräftige Entfernungsmetrik verwenden können. Dies war seit der Erfindung des Algorithmus immer der Fall, aber nur wenige Menschen scheinen sich dessen bewusst zu sein, so dass k-means wahrscheinlich der am häufigsten missbrauchte Algorithmus beim maschinellen Lernen ist.
Die euklidische Distanz macht für spärliche kategoriale Daten (Text Mining) keinen Sinn, daher würde ich so etwas nicht einmal ausprobieren. Sie müssen zunächst herausfinden, welche Entfernungsmetrik für Ihre Daten geeignet ist (@ttnphns erläutert hier einige mögliche Maßnahmen: Was ist die optimale Entfernungsfunktion für Personen, wenn Attribute nominal sind? ). Dann können Sie die Distanzmatrix berechnen und einen Clustering-Algorithmus verwenden, der über einen arbeiten kann (z. B. k-Mediane / PAM, verschiedene hierarchische Algorithmen usw.).
quelle