如何在 R 中为 kmeans 指定距离度量?

Posted

技术标签:

【中文标题】如何在 R 中为 kmeans 指定距离度量?【英文标题】:How to specify distance metric while for kmeans in R? 【发布时间】:2011-11-23 08:30:22 【问题描述】:

我在 R 中进行 kmeans 聚类有两个要求:

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

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

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

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

那么在 R 中是否有一些简单的方法可以满足我的两个要求来进行 kmeans 聚类?

【问题讨论】:

您可以使用vegan::designdist 创建自己的索引(如果已经存在,请参见vegan::vegdist)。拥有 dist 对象后,您可以在 stats 包中使用 hclust 来使用适当的聚合方法。 @RomanLuštrik,感谢您的评论。我知道如何用 hclust 指定距离度量,但现在我需要知道如何用 kmeans 来做。 【参考方案1】:

查看flexclust 包:

main函数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>

【讨论】:

感谢 rcs !当我将 dist 指定为:family=kccaFamily(dist=function(x, y) 1 - cor(x,y) ) 时,为什么会出现“尺寸不兼容”错误? 您需要一个带有参数xcenters 的函数。例如看flexclust::distCor的源代码 如果有人对如何使用 distCor 感到困惑,请尝试:res = kcca(data, 10, family=kccaFamily(dist=distCor)) 作为一名 R 菜鸟,我也花了一段时间才弄清楚如何查看 res 具有哪些属性(使用 attributes(res) 确定,使用 attr(res, 'second') 访问。

以上是关于如何在 R 中为 kmeans 指定距离度量?的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中为 2D 核密度估计实现不同的核

如何计算质心和数据矩阵之间的距离(用于 kmeans 算法)

在 scikit-learn 中为 KNN 使用除 p-norm 之外的其他成对距离度量

聚类算法讲解:KMEANS和DBSCAN

如何在 Matlab 或 R 中进行重叠聚类分析?

如何使用 KMEANS 计算每个记录的聚类距离?