2016-08-03 21 views
12

Nachdem ich einige Clusteralgorithmen getestet hatte, erreichte ich die beste Leistung in meinem Datensatz mit flexclust::kcca mit family = kccaFamily("angle").Wie Leistungsstatistikdaten von Flexclust generieren?

Hier ist ein Beispiel mit dem Datensatz Nclus von flexclust.

library(fpc) 
library(flexclust) 
data(Nclus) 

k <- 4 
family <- flexclust::kccaFamily("angle") 
model <- flexclust::kcca(Nclus, k, family) 

Jetzt möchte ich die Anzahl der Cluster optimieren. Der umfassendste Satz von Leistungsmetriken für Clustermodelle scheint unter Verwendung von fpc::cluster.stats gefunden zu werden. Diese Funktion benötigt zwei Eingaben: eine Abstandsmatrix und die zugewiesenen Cluster.

Letzteres ist einfach; Es ist nur [email protected].

Ich kämpfe mit, was für die Abstandsmatrix zu sorgen. kcca gibt kein Entfernungsobjekt zurück (oder wenn es so ist, habe ich es nicht gefunden).

Ich denke, dass ich normalerweise dist(Nclus) verwenden würde. In diesem Fall möchte ich nicht den euklidischen Abstand (oder eine der anderen verfügbaren Methoden zu dist) – Ich möchte das Abstandsmaß von dem Cluster-Algorithmus verwendet werden. Ich kann die Distanzmatrix, die von kcca verwendet wird, mit dem Code aus dieser Funktion neu erstellen.

control <- as(list(), "flexclustControl") 
centers <- flexclust:::initCenters(Nclus, k, family, control) 
distmat <- distAngle(Nclus, centers$centers) 

Dann sollte ich nur in der Lage sein, die Cluster-Modell Statistiken berechnen

fpc::cluster.stats(distmat, [email protected]) 

Das Problem ist, dass mir zwei Warnungen über die der Abstand Argument gibt.

Warning messages: 
1: In as.dist.default(d) : non-square matrix 
2: In as.matrix.dist(d) : 
    number of items to replace is not a multiple of replacement length 

Das lässt mich vermuten, dass ich es falsch gebe.

Wie soll ich die Distanzmatrix an cluster.stats übergeben?

+0

übrigens 'fpc :: cluster.stats' viel Speicher benötigt, so ist es selbst für mäßig große Datensätze unpraktisch. Am Ende ging ich mit cluster :: silhouette. –

Antwort

3

Ich denke, man

distmat <- distAngle(Nclus, Nclus) 

Jedoch verwenden soll, ich bin nicht sicher, dass dieses Gefühl aus der Modellierung Sicht macht: die Leistung Ihrer Clustering Ausgabe zu untersuchen, sollen Sie die Metrik verwenden, die besser geeignet ist, Ihr spezifischer Anwendungsfall; dies könnte (oder auch nicht) der L1 Abstand:

distmat <- dist(Nclus, "manhattan") 

Insbesondere, ich denke, würde, dass der „zwischen Beobachtung und Schwer/standardisierten mittleren Winkel“ minimiert ist nicht das gleiche wie der Intra-Cluster Winkel zu minimieren zwischen den Beobachtungen; Ich denke auch, dass die letztere Menge nicht besonders nützlich für Modellierungszwecke ist. Mit anderen Worten, ich würde distAngle als einen alternativen Weg ("Trick") betrachten, um die k-Cluster zu identifizieren, aber ich würde dann die identifizierten Cluster anhand anderer Metriken bewerten. Hoffe, dass dies Sinn macht Ihnen ...

+2

Ich stimme Renato zu. Das Problem ist, dass 'cluster.stats()' erwartet eine symmetrische paarweise Abstandsmatrix mit jedem Elemente im Vergleich gegenüber jedem anderen Elemente (z 'as.matrix (dist (Nclus))'). Die 'distAngle (Nclus, Zentren $ Zentren)' Ausdruck ist jedoch die Datenpunkte mit den Clusterzentren zu vergleichen, so dass Sie eine nicht symmetrische Distanzmatrix erhalten. Als solche müssen Sie entweder eine andere Distanzmessung verwenden, z. B. die von Renato vorgeschlagene L1-Entfernung, oder einen anderen Ansatz zum Bewerten der Clusterzuweisungen finden. –

+0

@KeithHughitt Ihre Erklärung ist in der Tat viel klarer als meins ... –