3

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

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

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

4

1 回答 1

0

背景

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 上的“我奶奶做饭”的答案。

于 2021-11-20T13:45:25.877 回答