我正在实施Mahalanobis distance来测量同一个游泳池的两个向量之间的距离,并且只是认识到它似乎是最正确的,但有时不是,可能是由于负值。 我意识到有时候
出现负值。这就是为什么距离分别为负的原因因为负值的根而引发错误。 我想知道这个问题。数据是(一行代表一个对象):
A: 376.498943729227 2.75082585760394 376.688899264061 2.75084113940164
B: 373.287817831307 2.75074375125675 373.392663499518 2.75092754974534
C: 377.091938091279 2.75082292557743 377.466035993347 2.75077191984784
D: 374.799551607287 2.75094834987157 374.209110037364 2.75091796001419
然后协方差矩阵S
7.13457e-09 3.13933e-05 5.45925e-10 3.80508e-06
3.13933e-05 2.96355 -0.000115865 3.28797
5.45925e-10 -0.000115865 5.31665e-09 -0.000137211
3.80508e-06 3.28797 -0.000137211 3.79042
,它的反面是
3.24779e+22 -8.58499e+18 1.40166e+22 7.92177e+18
-8.58499e+18 2.2693e+15 -3.70505e+18 -2.09399e+15
1.40166e+22 -3.70505e+18 6.04917e+21 3.41882e+18
7.92177e+18 -2.09399e+15 3.41882e+18 1.93222e+15
现在我想知道为什么我会从突出显示的产品中得到负面结果(如果是B和D)? 我不确定它是否是编程问题(这就是为什么我还没有包含代码行),或者更确切地说是理论问题,但我很感激任何帮助!
我使用Eigen类。
修改
我通过R
计算了协方差矩阵S的特征值,得到:
7.593311e + 02 1.243531e-01 1.156646e-02 -3.920936e-04
为什么我有不同的? 我用了
M<- matrix(c(376.498943729227, 2.75082585760394, 376.688899264061, 2.75084113940164,
373.287817831307, 2.75074375125675, 373.392663499518, 2.75092754974534,
377.091938091279, 2.75082292557743, 377.466035993347, 2.75077191984784,
374.799551607287, 2.75094834987157, 374.209110037364, 2.75091796001419
), 4, 4)
> M
[,1] [,2] [,3] [,4]
[1,] 376.498944 373.287818 377.091938 374.799552
[2,] 2.750826 2.750744 2.750823 2.750948
[3,] 376.688899 373.392663 377.466036 374.209110
[4,] 2.750841 2.750928 2.750772 2.750918
ev<- eigen(M)
values<- ev$values
values
[1] 7.593311e+02 1.243531e-01 1.156646e-02 -3.920936e-04
答案 0 :(得分:3)
您的协方差矩阵有两个几乎为零的特征值(10 ^ -10和10 ^ -18)。因此,矩阵不易被反转,甚至可能被认为是不可逆的。
两个小特征值的原因是您的数据点不会填满整个4D空间,而只会填充2D子空间(嵌入4D的平面)。
要计算合理的距离,您需要将点投影到2D空间(或您的实际数据具有的任何维度)。你可以用PCA做到这一点。在此之后,您可以用2D计算距离。
答案 1 :(得分:2)
我将您的矩阵复制并粘贴到Matlab并计算特征值,其中最小的是-4.0819e-13
。
哪个看起来不那么糟糕,但它显示出一个问题。协方差矩阵应为正半定,因此没有特征值应小于0
。可能由于代码中的舍入问题,矩阵具有(略微)负的特征值,这可能导致像您一样的问题。
此外,由于两个特征值几乎为零,因此计算逆是一个非常勇敢的举动。含义:你不应该,因为你实际上是在计算奇异矩阵的逆矩阵。