2011-09-23 22 views
13

我做中的R k均值聚类有两个要求:如何指定R中kmeans的距离度量?

  1. 我需要用户自己指定距离的功能,现在它的Pearson相关系数。

  2. 我想要使用群组成员的平均值作为质心的群集,而不是一些实际的成员。 这个要求的原因是我认为使用平均值作为质心比使用实际成员更有意义,因为成员总是不在真实质心附近。如果我对此有错,请纠正我。

首先我试过kmeans功能stat包,但此功能不会允许自定义距离法。

然后我发现pam函数在cluster包中。 pam函数允许通过以dist对象为参数来允许自定义距离度量,但在我看来,通过这样做,它将实际成员作为质心,这不是我所期望的。因为我不认为它可以用距离矩阵完成所有的距离计算。

那么在R中做一些简单的方法来完成满足我的要求的kmeans聚类?

+1

你可以用'素食主义者:: designdist'创建自己的指数(见'素食主义者:: vegdist'如果它已经存在)。获得'dist'对象后,可以在stats包中使用'hclust'来使用适当的聚合方法。 –

+1

@RomanLuštrik,感谢评论。我知道如何用hclust指定距离度量,但现在我需要知道如何用kmeans来完成。 –

回答

17

检查flexclust包:

主要功能kcca实现用于 K-质心聚类分析支持任意距离措施 和形心计算的一般框架。

该软件包还包括一个功能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

谢谢rcs!当我将dist指定为:family = kccaFamily(dist = function(x,y){1-cor(x,y)})时,为什么我会得到“不兼容的维度” –

+0

您需要一个带'x'和'center'参数的函数。例如,请参阅“flexclust :: distCor”的源代码。 – rcs

+1

如果有人对如何使用distCor感到困惑,请尝试:'res = kcca(data,10,family = kccaFamily(dist = distCor))' –