2011-09-23 8 views
13

sto facendo Kmeans clustering in R con due esigenze:Come specificare la metrica della distanza per kmea in R?

  1. ho bisogno di specificare la mia funzione di distanza, ora è il Pearson coefficiente.

  2. Desidero eseguire il clustering che utilizza la media dei membri del gruppo come centroidi, piuttosto un membro effettivo. La ragione di questo requisito è che penso che usare la media come centroide abbia più senso dell'uso di un membro effettivo poiché i membri non sono sempre vicini al centroide reale. Per favore correggimi se ho torto su questo.

Per prima cosa ho provato la funzione kmeans in stat pacchetto, ma questa funzione non permette metodo distanza personalizzata.

Quindi ho trovato la funzione pam nel pacchetto cluster. La funzione pam consente metrica di distanza personalizzata prendendo un oggetto dist come parametro, ma mi sembra che in questo modo ci vogliono membri effettivi come centroidi, che non è quello che mi aspetto. Dal momento che non penso che possa fare tutto il calcolo della distanza con solo una matrice di distanza.

Quindi c'è un modo semplice in R per fare il clustering dei chilometri che soddisfa entrambe le mie esigenze?

+1

È possibile utilizzare 'vegan :: designdist' per creare il proprio indice (vedere anche' vegan :: vegdist' se è già lì). Dopo aver ottenuto l'oggetto 'dist', puoi usare' hclust' nel pacchetto stats per usare il tuo metodo di aggregazione appropriato. –

+1

@ RomanLuštrik, grazie per il commento. So come specificare la metrica di distanza con hclust, ma ora ho bisogno di sapere come farlo con i kmea. –

risposta

17

controllare il pacchetto flexclust:

La funzione principale kcca implementa un quadro generale per k-centroidi cluster analysis sostenere misure di distanza arbitrarie e calcolo baricentro.

Il pacchetto include anche una funzione 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

Grazie! Perché ottengo l'errore "dimensione incompatibile" quando si specifica dist come: family = kccaFamily (dist = function (x, y) {1 - cor (x, y)})? –

+0

Hai bisogno di una funzione con argomenti 'x' e' centri'. Si veda ad esempio il codice sorgente di 'flexclust :: distCor' – rcs

+1

Nel caso qualcuno sia confuso su come usare distCor, prova:' res = kcca (data, 10, family = kccaFamily (dist = distCor)) ' –