我想在K-means算法中使用Mahalanobis距离,因为我有4个高度相关的变量(0.85)
在我看来,在这种情况下使用Mahalanobis距离会更好.
问题是我不知道如何使用K-means算法在R中实现它.
我认为我需要在聚类步骤之前"伪造"它来转换数据,但我不知道如何.
我尝试了经典的kmeans,标准化数据的欧几里德距离,但正如我所说,有太多的相关性.
适合< - kmeans(mydata.standardize,4)
我也试图找到一个距离参数,但我认为它在kmeans()函数中不存在.
预期的结果是应用具有马哈拉诺比斯距离的K均值算法的方法.
Vin*_*ynd 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)
Run Code Online (Sandbox Code Playgroud)
但是这假设所有聚类具有与整个数据相同的形状和方向.如果不是这种情况,您可能需要查看明确允许椭圆簇的模型,例如,在mclust包中.