2016-08-03 31 views
12

Po wypróbowaniu kilku algorytmów grupowania, uzyskałem najlepszą wydajność w moim zestawie danych przy użyciu flexclust::kcca z family = kccaFamily("angle").Jak generować statystyki wydajności klastrów z Flexclust?

Oto przykład przy użyciu zestawu danych Nclus z flexclust.

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

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

Teraz chcę zoptymalizować liczbę klastrów. Najbardziej wszechstronny zestaw wskaźników wydajności dla modeli klastrów wydaje się znajdować pod adresem fpc::cluster.stats. Ta funkcja wymaga dwóch danych wejściowych: macierzy odległości i przypisanych klastrów.

To ostatnie jest łatwe; to tylko [email protected].

Walczę z tym, co zapewnić matrycy odległości. kcca nie zwraca obiektu odległości (lub jeśli nie, nie znalazłem go).

Domyślam się, że zazwyczaj użyłbym dist(Nclus). W tym przypadku nie chcę, aby odległość euklidesowa (lub jakakolwiek inna metoda dostępna do dist) – Chcę miary odległości używanej przez algorytm grupowania. Mogę odtworzyć macierz odległości używaną przez kcca przy użyciu kodu z tej funkcji.

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

Następnie należy po prostu być w stanie obliczyć statystyk modelu klastra za pomocą

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

Kłopot jest, że daje mi dwa ostrzeżenia o argument na odległość.

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 

To sprawia, że ​​podejrzewam, że podaję coś niewłaściwego.

Jak przekazać matrycę odległości do cluster.stats?

+0

Nawiasem mówiąc, 'fpc :: cluster.stats' wymaga dużej ilości pamięci, więc jest niepraktyczne nawet dla umiarkowanych rozmiarów zestawów danych. Na końcu pojechałem z 'cluster :: silhouette'. –

Odpowiedz

3

Chyba należy użyć

distmat <- distAngle(Nclus, Nclus) 

Jednak nie jestem pewien, że to ma sens z punktu widzenia modelowania: zbadanie wydajności produkcji klastrowego należy użyć metrykę, która jest bardziej odpowiednia do listy konkretny przypadek użycia; to może (lub nie może) być odległość L1:

distmat <- dist(Nclus, "manhattan") 

W szczególności, to myślę, że minimalizowanie „Kąt między obserwacji i ciężkości/standaryzowanego oznaczać” nie jest taka sama jak minimalizacja kąta wewnątrz klastra między obserwacjami; także przypuszczam, że ta ostatnia ilość nie jest szczególnie przydatna do celów modelowania. Innymi słowy, uznałbym distAngle za alternatywny sposób ("trick") w celu zidentyfikowania klastrów k, ale wtedy oceniłbym zidentyfikowane klastry za pomocą innych danych. Mam nadzieję, że to ma dla ciebie jakiś sens ...

+2

Zgadzam się z Renato. Problem polega na tym, że 'cluster.stats()' oczekuje symetrycznej macierzy odległości między parami z każdym elementem w porównaniu z każdym innym elementem (np. 'As.matrix (dist (Nclus))'). Wyrażenie 'distAngle (Nclus, centres $ centres)' jednak porównuje punkty danych z centroidami klastra, więc otrzymujesz niesymetryczną macierz odległości. Jako takie, musisz użyć innej miary odległości, takiej jak odległość L1 sugerowana przez renato, lub znaleźć inne podejście do oceny przypisania klastra. –

+0

@KeithHughitt twoje wyjaśnienie jest w istocie o wiele jaśniejsze niż moje ... –