2011-09-23 12 views
13

robię kmeans klastrów w zakresie badań z dwóch warunków:Jak określić metrykę odległości dla kmeans w R?

  1. muszę podać własną funkcję odległości, teraz nadszedł Współczynnik Pearsona.

  2. Chcę zrobić klastrowanie, które wykorzystuje średnią członków grupy jako centroidów, a raczej rzeczywistego członka. Powodem tego wymogu jest to, że myślę, że używanie średniej jako środka ciężkości ma więcej sensu niż używanie faktycznego członka, ponieważ członkowie nie zawsze znajdują się w pobliżu rzeczywistego środka ciężkości. Proszę mnie poprawić, jeśli się mylę.

Najpierw próbowałem funkcję kmeans w stat pakietu, ale ta funkcja nie pozwala sposób niestandardowy odległość.

Potem znalazłem funkcję pam w pakiecie cluster. Funkcja pam zezwala na niestandardową metrykę odległości, przyjmując jako parametr obiekt dist, ale wydaje mi się, że robiąc to, przyjmuje rzeczywistych członków jako centroidy, co nie jest tym, czego oczekuję. Ponieważ nie sądzę, że może wykonać wszystkie obliczenia odległości za pomocą tylko macierzy odległości.

Czy jest jakiś prosty sposób na zrobienie klastrowania w kmeans, który spełnia oba moje wymagania?

+1

Można użyć 'wegańskie :: designdist' stworzyć swój własny indeks (patrz także' wegańskie :: vegdist' jeśli już tam). Po utworzeniu obiektu 'dist' możesz użyć pakietu' hclust' in stats, aby użyć odpowiedniej metody agregacji. –

+1

@ RomanLuštrik, dzięki za komentowanie. Wiem, jak określić metrykę odległości za pomocą hclust, ale teraz muszę wiedzieć, jak to zrobić z kmeans. –

Odpowiedz

17

sprawdzał pakiet flexclust:

Główną funkcją kcca realizuje ogólne ramy k-centroidy analizy klastra wspierania dowolne środki dystansowe i ciężkości obliczeń.

Pakiet zawiera również funkcję distCor:

R> flexclust::distCor 
function (x, centers) 
{ 
    z <- matrix(0, nrow(x), ncol = nrow(centers)) 
    for (k in 1:nrow(centers)) { 
     z[, k] <- 1 - .Internal(cor(t(x), centers[k, ], 1, 0)) 
    } 
    z 
} 
<environment: namespace:flexclust> 
+0

Dzięki rcs! Dlaczego pojawia się błąd "niekompatybilny wymiar", gdy określam dist jako: family = kccaFamily (dist = function (x, y) {1 - cor (x, y)})? –

+0

Potrzebujesz funkcji z argumentami 'x' i' centers'. Zobacz na przykład kod źródłowy 'flexclust :: distCor' – rcs

+1

Jeśli ktoś ma wątpliwości, jak używać distCor, spróbuj:' res = kcca (dane, 10, rodzina = kccaFamily (dist = distCor)) ' –