如何在R中指定kmeans算法的距离度量方式?

14

我正在使用R进行kmeans聚类,并有两个要求:

  1. 我需要指定自己的距离函数,现在是皮尔逊系数。

  2. 我想要进行聚类,使用组成员的平均值作为质心,而不是实际的成员。 这个要求的原因是,我认为使用平均值作为质心比使用实际成员更有意义,因为成员通常不接近真正的质心。如果我对此有误,请纠正我。

首先,我尝试了 stat 包中的 kmeans 函数,但该函数不允许自定义距离方法。

然后我发现 cluster 包中的 pam 函数。通过接受一个dist对象作为参数,pam函数允许自定义距离度量,但我觉得通过这样做它采用了实际成员作为质心,这并不是我所期望的。因为我认为它不能仅通过距离矩阵来完成所有的距离计算。

那么,在R中有没有一些简单的方法可以满足我同时满足这两个要求的kmeans聚类?


1
你可以使用 vegan::designdist 来创建自己的指数(如果已经存在,也可以查看 vegan::vegdist)。在获得 dist 对象之后,您可以使用统计包中的 hclust 来使用适当的聚合方法。 - Roman Luštrik
1
@RomanLuštrik,感谢您的评论。我知道如何使用hclust指定距离度量,但现在我需要知道如何在kmeans中实现它。 - Derrick Zhang
1个回答

17

请查看flexclust包:

主要函数kcca实现了支持任意距离测量和质心计算的k-centroids聚类分析的通用框架。

该包还包括一个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>

谢谢rcs!当我指定dist为:family = kccaFamily(dist = function(x,y){1-cor(x,y)})时,为什么会出现“不兼容的维度”错误? - Derrick Zhang
你需要一个带有参数 xcenters 的函数。例如,可以查看 flexclust::distCor 的源代码。 - rcs
1
如果有人对如何使用distCor感到困惑,请尝试:res = kcca(data, 10, family=kccaFamily(dist=distCor)) - Dolan Antenucci
2
作为 R 的新手,我也花了一些时间才弄清楚如何查看 res 的属性(使用 attributes(res) 进行确定,使用 attr(res, 'second') 进行访问)。 - Dolan Antenucci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接