含有向量和协方差矩阵的负积

时间:2018-02-27 12:34:03

标签: c++ eigen

我正在实施Mahalanobis distance来测量同一个游泳池的两个向量之间的距离,并且只是认识到它似乎是最正确的,但有时不是,可能是由于负值。 我意识到有时候

  

formula

出现负值。这就是为什么距离分别为负的原因因为负值的根而引发错误。 我想知道这个问题。数据是(一行代表一个对象):

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

2 个答案:

答案 0 :(得分:3)

您的协方差矩阵有两个几乎为零的特征值(10 ^ -10和10 ^ -18)。因此,矩阵不易被反转,甚至可能被认为是不可逆的。

两个小特征值的原因是您的数据点不会填满整个4D空间,而只会填充2D子空间(嵌入4D的平面)。

要计算合理的距离,您需要将点投影到2D空间(或您的实际数据具有的任何维度)。你可以用PCA做到这一点。在此之后,您可以用2D计算距离。

答案 1 :(得分:2)

我将您的矩阵复制并粘贴到Matlab并计算特征值,其中最小的是-4.0819e-13

哪个看起来不那么糟糕,但它显示出一个问题。协方差矩阵应为正半定,因此没有特征值应小于0。可能由于代码中的舍入问题,矩阵具有(略微)负的特征值,这可能导致像您一样的问题。

此外,由于两个特征值几乎为零,因此计算逆是一个非常勇敢的举动。含义:你不应该,因为你实际上是在计算奇异矩阵的逆矩阵。