2011-09-23 18 views
13

que estoy haciendo kmeans agrupación en R con dos requisitos:¿Cómo se especifica la métrica de distancia mientras que para kmeans en R?

  1. necesito especificar mi propia función de distancia, ahora es el coeficiente de Pearson.

  2. Quiero hacer la agrupación en clúster que utiliza la media de miembros del grupo como centroides, en lugar de un miembro real. La razón de este requisito es que creo que usar el promedio como centroide tiene más sentido que usar un miembro real, ya que los miembros no siempre están cerca del centroide real. Por favor, corrígeme si me equivoco sobre esto.

Primero probé la función kmeans en stat paquete, pero esta función no permite el método de la distancia medida.

Luego encontré la función pam en el paquete cluster. La función pam permite métricas de distancia personalizadas tomando como parámetro un objeto dist, pero me parece que al hacerlo se necesitan miembros reales como centroides, que no es lo que esperaba. Ya que no creo que pueda hacer todo el cálculo de distancia con solo una matriz de distancia.

Entonces, ¿hay alguna manera fácil en R para hacer la agrupación kmeans que satisfaga mis dos requisitos?

+1

Puede usar 'vegetariana :: designdist' para crear su propio índice (también ver' vegetariana :: vegdist' si ya existe). Después de tener su objeto 'dist', puede usar' hclust' en el paquete de estadísticas para usar su método de agregación apropiado. –

+1

@ RomanLuštrik, gracias por comentar. Sé cómo especificar la métrica de distancia con hclust, pero ahora necesito saber cómo hacerlo con kmeans. –

Respuesta

17

comprobar el paquete flexclust:

La función principal kcca implementa un marco general para k-centroides análisis de conglomerados medidas de apoyo distancia arbitraria y cálculo centroide.

El paquete también incluye una función 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

Gracias rcs! ¿Por qué obtengo un error de "dimensión incompatible" cuando especifico dist como: familia = kccaFamily (dist = función (x, y) {1 - cor (x, y)})? –

+0

Necesita una función con argumentos 'x' y' centers'. Ver por ejemplo el código fuente de 'flexclust :: distCor' – rcs

+1

En caso de que alguien esté confundido sobre cómo usar distCor, intente:' res = kcca (data, 10, family = kccaFamily (dist = distCor)) ' –

Cuestiones relacionadas