【问题标题】:K-means and Mahalanobis distanceK-means 和 Mahalanobis 距离
【发布时间】:2013-04-22 21:23:47
【问题描述】:

我想在 K-means 算法中使用马氏距离,因为我有 4 个高度相关的变量 (0.85)

在我看来,在这种情况下最好使用马氏距离。

问题是我不知道如何在 R 中使用 K-means 算法来实现它。

我认为我需要在聚类步骤之前在转换数据时“伪造”它,但我不知道如何。

我尝试了经典的 kmeans,在标准化数据上使用欧几里得距离,但正如我所说,相关性太大。

适合

我也试过找一个距离参数,但我认为kmeans()函数中不存在。

预期结果是一种将 K-means 算法与马氏距离相结合的方法。

【问题讨论】:

  • 我们可以等到 OP 有机会改进她的问题后再结束吗?您能否将您的问题扩展为到目前为止您尝试了什么以及您的预期结果是什么?
  • 对不起,我想,这个问题有一个快速的答案。我编辑了帖子

标签: r


【解决方案1】:

您可以在 Brian S. Everitt 的书 -“An R and S-PLUS® Companion to Multivariate Analysis”的第 10 页中看到马氏距离的公式。当样本协方差为单位矩阵时,欧几里得距离是马氏距离的一种特殊情况。那么'y'中重新缩放数据的欧几里得距离是马氏距离。

# Rescale the data
C <- chol( var(x) )
y <- x %*% solve(C)
var(y) # The identity matrix

【讨论】:

    【解决方案2】:

    您可以在运行算法之前重新调整数据, 使用方差矩阵的 Cholesky 分解: 变换后的欧几里得距离 是之前的马氏距离。

    # Sample data 
    n <- 100
    k <- 5
    x <- matrix( rnorm(k*n), nr=n, nc=k )
    x[,1:2] <- x[,1:2] %*% matrix( c(.9,1,1,.9), 2, 2 )
    var(x)
    
    # Rescale the data
    C <- chol( var(x) )
    y <- x %*% solve(C)
    var(y) # The identity matrix
    
    kmeans(y, 4)
    

    但这假设所有集群都具有与整个数据相同的形状和方向。 如果不是这种情况,您可能需要查看明确允许椭圆集群的模型, 例如,在 mclust 包中。

    【讨论】:

    • 你有没有任何参考表明变换后的欧几里得距离是之前的马氏距离?
    • 嗨,Python 中有什么包可以做到这一点吗?非常感谢。
    猜你喜欢
    • 2019-06-01
    • 2013-09-12
    • 2013-02-02
    • 2019-01-27
    • 2019-05-07
    • 1970-01-01
    • 2018-09-30
    • 2018-04-06
    • 2012-08-21
    相关资源
    最近更新 更多