【问题标题】:How to use Mahalanobis distance to find the K Nearest Neighbor in R如何使用 Mahalanobis 距离在 R 中找到 K 最近邻
【发布时间】:2023-06-09 02:01:01
【问题描述】:

我有一个从 1970 年到 2020 年的时间序列数据集作为我的训练数据集,我还有一个 2021 年的单一观察,我现在要做的是使用马氏距离来识别 2021 年训练数据集中的 10 个最近邻。我尝试了几个函数,如get.knn()get.knnx(),但我未能将距离设置为马氏距离。有什么我可以使用的功能吗?提前谢谢!

--------------------编辑--------

所以我尝试了mahalanobis() 的函数,然后我得到了一个值列表,这些值是马氏距离吗?我可以对它们进行排序以获得前 10 名吗?

【问题讨论】:

  • 请提供可重现的数据并显示您的代码。
  • 试试biotools 包。它也有一些马氏函数

标签: r mahalanobis


【解决方案1】:

背景

马氏距离衡量一个点与平均值的距离,以标准差衡量,请参阅Wikipedia。它使用特征值旋转坐标,与主成分分析有关。 Cross Validated 包含几个很好的解释,例如这"bottom-to-top-explanation"functioncholMaha,见下文)如何估计距离矩阵。

马氏距离与 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.distfrom package 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)

现在重点来了。我们还可以将 马氏距离 估计为主成分分析的重新缩放载荷(旋转数据)的 欧几里得距离

## 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 上的 "My grandma cooks" 答案。

【讨论】: