3

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

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

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

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

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

适合 <- kmeans(mydata.standardize, 4)

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

预期结果是一种将 K-means 算法与 Mahalanobis 距离一起应用的方法。

4

2 回答 2

13

您可以在运行算法之前重新缩放数据,使用方差矩阵的 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包中。

于 2013-04-29T10:05:14.287 回答
0

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

# Rescale the data
C <- chol( var(x) )
y <- x %*% solve(C)
var(y) # The identity matrix
于 2019-01-19T11:47:18.093 回答