如何在 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) ) 时,为什么会出现“尺寸不兼容”错误? 您需要一个带有参数x
和centers
的函数。例如看flexclust::distCor
的源代码
如果有人对如何使用 distCor 感到困惑,请尝试:res = kcca(data, 10, family=kccaFamily(dist=distCor))
作为一名 R 菜鸟,我也花了一段时间才弄清楚如何查看 res
具有哪些属性(使用 attributes(res)
确定,使用 attr(res, 'second')
访问。以上是关于如何在 R 中为 kmeans 指定距离度量?的主要内容,如果未能解决你的问题,请参考以下文章
如何计算质心和数据矩阵之间的距离(用于 kmeans 算法)