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

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

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

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

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

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

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

【问题讨论】:

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

标签: r cluster-analysis k-means


【解决方案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') 访问。
猜你喜欢
  • 2023-03-06
  • 2013-10-04
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多