我正在编写一个函数来获取两个向量之间的Mahalanobis距离。我知道这是使用等式a'* C ^ -1 * b实现的,其中a和b是向量而C是协方差矩阵。我的问题是,有没有一种有效的方法来找到矩阵的逆矩阵而不使用Gauss-Jordan消除,或者没有办法解决这个问题?我正在寻找一种方法来做到这一点,而不是任何预定义的功能。
我知道C是一个Hermitian,正定矩阵,所以有什么方法可以算法利用这个事实吗?或者是否有一些聪明的方法计算马哈拉诺比斯距离而不计算协方差的倒数?任何帮助将不胜感激。
***编辑:上面的马哈拉诺比斯距离方程是不正确的。它应该是 x'* C ^ -1 * x其中x =(b-a),而b和a是我们试图找到距离的两个向量(感谢LRPurser)。因此,在所选答案中提出的解决方案如下:
d = x'* b,其中b = C ^ -1 * x C * b = x,因此使用LU分解或LDL'分解求解b。
答案 0 :(得分:9)
你可以(并且应该!)使用LU decomposition而不是显式反转矩阵:使用分解求解C x = b
具有比计算C^-1
更好的数字属性并乘以向量{{1 }}
由于矩阵是对称的,因此LU分解实际上等同于LDL* decomposition,这是您在实际情况中应该使用的。由于您的矩阵也是正定的,因此您应该能够在不进行旋转的情况下执行此分解。
编辑:请注意,对于此应用程序,您无需解决完整的b
问题。
相反,给定C x = b
和差异向量C = L D L*
,解析v = a-b
L* y = v
(这是完整LU解算器的一半)。
然后,y
可以在线性时间内计算。
答案 1 :(得分:8)
第一马哈拉诺比斯距离(MD)是关于两个向量的测量中的不确定性的标准距离。当C=Indentity matrix
时,MD减少到欧几里德距离,因此产品减少到向量范数。对于所有非零向量,MD总是正定的或大于零。通过适当选择向量a
和b
的方式,a*C^-1*b
可以小于零。希望您正在寻找的向量的差异是x=(a-b)
,这使得计算x^t*C^-1*x
,其中x^t
是向量x
的转置。另请注意MD=sqrt(x^t*C^-1*x)
由于你的矩阵是对称的和肯定的,所以你可以使用Cholesky分解(MatLab-chol)
,它使用一半的操作作为LU并且在数值上更稳定。 chol(C)=L
其中C=L*L^t
其中L
是下三角矩阵,L^t
是L
的转置,使其为上三角形。你的算法应该是这样的
(Matlab)
x=a-b;
L=chol(C);
z=L\x;
MD=z'*z;
MD=sqrt(MD);