背景
Mahalanobis 距离衡量一个点与平均值的距离,以标准差衡量,请参阅Wikipedia。它使用特征值旋转坐标,与主成分分析有关。Cross Validated 包含几个很好的解释,例如这个“自下而上的解释”或一个函数(cholMaha
见下文)如何估计距离矩阵。
马氏距离与 PCA 的关系
让我们假设一个小数据示例:
A <- data.frame(
x = c(-2.48, -4.03, 1.15, 0.94, 5.33, 4.72),
y = c(-3.92, -3.4, 0.92, 0.78, 3.44, 0.5),
z = c(-1.11, -2.18, 0.21, 0.34, 1.74, 1.12)
)
D2.dist
然后我们可以通过包biotools或上述函数估计马氏距离矩阵:
## Mahalanobis distance from package biotools
library("biotools")
# sqrt, because D2.dist returns squared version
sqrt(D2.dist(A, cov(A)))
## https://stats.stackexchange.com/questions/65705/pairwise-mahalanobis-distances
cholMaha <- function(X) {
dec <- chol( cov(X) )
tmp <- forwardsolve(t(dec), t(X) )
dist(t(tmp))
}
cholMaha(A)
现在是重点。我们还可以将Mahalanobis 距离估计为主成分分析的重新缩放载荷(旋转数据)的欧几里德距离:
## derive Mahalanobis distance from principal components
pc <- prcomp(A) # principal components
AA <- scale(pc$x) # "upscale" all components to the same level
# Euclidean distance of rescaled PC transformed variables is identical to
# Mahalanobis distance
dist(AA)
结果与上述两种方法相同。
应用于分类算法
现在可以在任何分类算法中使用这种关系。只需通过 PCA 旋转变换数据矩阵并拟合它们的欧几里德距离。
## Now apply this in any classification method, e.g. hclust
par(mfrow=c(1, 2))
# Euclidean distance of original variables
plot(hclust(dist(scale(A))), main="Euclidean")
# Euclidean distance of scaled principal components
# is equivalent to Mahalanobis distance; considers covariance
plot(hclust(dist(AA)), main="Mahalanobis")
实际上,隐藏在变量中的小影响因素被放大了,但不幸的是随机误差也是如此。要详细了解这一点,请阅读 Cross Validated 上的“我奶奶做饭”的答案。