我想在K-means算法中使用Mahalanobis距离,因为我有4个高度相关的变量(0.85)
在我看来,在这种情况下使用马哈拉诺比斯距离会更好。
问题是我不知道如何使用K-means算法在R中实现它。
我认为我需要在聚类步骤之前“伪造”它来转换数据,但我不知道如何。
我尝试了经典的kmeans,标准化数据的欧几里德距离,但正如我所说,有太多的相关性。
fit< - kmeans(mydata.standardize,4)
我也试图找到一个距离参数,但我认为它在kmeans()函数中不存在。
预期结果是一种将K-means算法应用于马哈拉诺比斯距离的方法。
答案 0 :(得分:12)
您可以在运行算法之前重新调整数据, 使用方差矩阵的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
包中。
答案 1 :(得分:0)
您可以在Brian S. Everitt的书的第10页中找到“马氏距离的公式”,“ R和S-PLUS®伴侣到多元分析”。当样本协方差是恒等矩阵时,欧氏距离是马哈拉诺比斯的一种特殊情况。那么,在“ y”中具有重新缩放的数据的欧氏距离就是马哈拉诺比斯。
df