2017-05-08 4 views
0

Ich bin derzeit in Hierarchie in den Themen der Dokumente. Als ersten Schritt finde ich eine Vektordarstellung meiner Dokumente, nach denen ich hierarchisches Clustering verwende, um zu bestimmen, ob es Themen in den Themen des Dokuments gibt. Ich möchte nur (verschachtelte) Cluster betrachten, die mindestens 2% Originaldaten enthalten. Um dies zu erreichen, verwende ich R.Erhalten von Cluster-Hierarchie und geschachtelten Cluster-Zuweisungen

Jetzt habe ich Probleme mit der effizienten Extraktion der Cluster-Hierarchie aus den Clustering-Ergebnissen. Das Clustering erfolgt mit dem Paket "fastcluster", das ähnliche Ergebnisse liefert wie die ursprüngliche Funktion "hclust".

Für meine endgültige Ausgabe sollte etwa so aussehen; es wird

Cluster Zuordnungen zwei Tabellen sein:

docID , ClusterLabel 
1, A 
2, A 
3, B 
4, B 
5, B 
3, C 
4, D 
5, C 
... 

Cluster Hierarchie:

Parent, Child 
B, C 
B, D 
... 

Wie Sie sehen können, die Beobachtungen 3,4 und 5 mehrfach in der Cluster-Zuordnungstabelle auftreten, wobei einer der Cluster ein Subcluster seines übergeordneten Clusters ist. Dies kann in der Hierarchie-Tabelle gesehen werden.

Mein aktueller Ansatz ist, dass ich die ctree.endogram-Funktion aus dem "Dendedend" -Paket zu verwenden, um die Cluster-Zuweisung für ein Raster von Werten von k zu finden, und dann die Cluster-Hierarchie und Zuordnungen aus der Ausgabe abzuleiten. Dieser Ansatz ist jedoch sehr naiv und wird für eine große Anzahl von Beobachtungen und Clustern sehr langsam.

Vorschläge, wie man dieses Problem effizient angehen kann, vorzugsweise mit einigen leicht verfügbaren Paketen, würde sehr geschätzt werden.

EDIT: Betrachten wir das folgende Beispiel, auf die Probenausgabedaten entsprechen:

data <- matrix(data = c(1,2,3,4,5,1,3,5,9,10), nrow = 5, ncol = 2) 
plot(data) 

hc<- hclust(dist(data)) 
plot(hc) 

Wenn wir den Baum in der Höhe 6 schneiden würde, wir 2 Clustern erhalten würde, genannt A und B in der Ausgabe. Sollten wir jedoch den Baum in der Höhe 4 schneiden, hätten wir 3 Cluster mit den Namen A, C und D in der Ausgabe. Zum Beispiel befindet sich die Beobachtung mit docID 3 entweder in Cluster B oder in Cluster C (abhängig von der Höhe, in der wir den Baum schneiden), was den zwei Einträgen in der Beispielausgabe-Clusterzuweisung entspricht. Der Cluster B ist in die beiden Cluster C und D aufgeteilt, die in der Cluster-Hierachy-Ausgabe zu sehen sind.

Jetzt ist mein Ziel, die vollständige Liste der Cluster-Zuweisung und Hierarchien zu erhalten, das Dendrogramm herunter zu bewegen. (vorzugsweise zu stoppen, wenn die Anzahl der Beobachtungen in einem (Sub) Cluster weniger als eine bestimmte Anzahl von Beobachtungen erreicht)

Bis jetzt habe ich es versäumt, eine vernünftige und effiziente Methode zu entwickeln, hoffentlich könnte mir jemand eine Idee.

+0

Hallo @ Bartdp1, könnten Sie bitte Ihre Frage mit einem eigenständigen reproduzierbaren Beispiel aktualisieren? –

+0

@TalGalili Ich aktualisierte die Frage, danke für einen Blick – BDP1

Antwort

1

Der k Parameter in der cutree Funktion kann einen Vektor von Werten erhalten und die Ausgabe würde wie folgt aussehen:

> data <- matrix(data = c(1,2,3,4,5,1,3,5,9,10), nrow = 5, ncol = 2) 
> hc<- hclust(dist(data)) 
> cutree(hc, k = 1:5) 
    1 2 3 4 5 
[1,] 1 1 1 1 1 
[2,] 1 1 1 2 2 
[3,] 1 1 2 3 3 
[4,] 1 2 3 4 4 
[5,] 1 2 3 4 5 

Ist damit Ihre Frage beantwortet?

+0

Nicht genau, beachten Sie, dass, wenn von 2 bis 3 Cluster gehen, Cluster "1" in Spalte 2 in zwei Cluster aufgeteilt ist, benannt Cluster "1" und Cluster "2" in Spalte 3. Die letzten beiden sind "Kinder" der ersten. Ich möchte den Unterschied zwischen den beiden beibehalten, daher sollten sie eindeutige Bezeichnungen haben (dies ist jetzt nicht der Fall, da die Bezeichnung "1" zweimal vorkommt). Natürlich kann ich sehen, dass es möglich ist, all dies von der Ausgabe abzuleiten, die Sie zur Verfügung stellen, aber dies wäre ziemlich teuer, vorausgesetzt, dass die Information aus dem Dendrogramm leicht verfügbar ist. Ich sehe einfach nicht, wie man es effizient extrahiert. – BDP1

+0

Ich bin mir nicht sicher, ob ich folge. Sie möchten, dass die zweite Spalte nur 2 und 3 hat und die dritte 3,4,5 - usw.? –

+0

Nicht per se. Zuerst versuche ich, aus einer hclust-Ausgabe die Beispielausgabe zu extrahieren, wie in der ursprünglichen Frage gezeigt. Also ich möchte eine Liste mit Cluster-Zuweisungen. Beobachtungen treten in dieser Liste mehrere Male auf, da, wenn ein Clusser in ein hierarchisches Clustering verschmolzen wird, eine Beobachtung sowohl im "Eltern" - als auch im "Kind" -Cluster stattfindet. Außerdem möchte ich eine Liste von Eltern-> Kinderbeziehungen erhalten. Für die Aufzeichnung, ich bin nicht sicher, ob Dendendend diese Funktionalität (oder Teile davon verwendet werden), aber ich hatte auf einen Stoß in die richtige Richtung, wie dies effizient zu programmieren erhofft. – BDP1

Verwandte Themen