10

我正在编写一个函数来获取两个向量之间的马氏距离。我知道这是使用方程 a'*C^-1*b 实现的,其中 a 和 b 是向量,C 是协方差矩阵。我的问题是,有没有一种有效的方法可以在不使用 Gauss-Jordan 消除的情况下找到矩阵的逆矩阵,或者没有办法解决这个问题?我正在寻找一种方法来自己做这件事,而不是使用任何预定义的函数。

我知道 C 是 Hermitian 正定矩阵,那么有什么方法可以在算法上利用这个事实吗?还是有一些聪明的方法可以计算马氏距离而不计算协方差的倒数?任何帮助,将不胜感激。

***编辑:上面的马氏距离方程不正确。它应该是 x'*C^-1*x,其中 x = (ba),b 和 a 是我们试图找到其距离的两个向量(感谢 LRPurser)。因此,所选答案中提出的解决方案如下:

d=x'*b,其中 b = C^-1*x C*b = x,因此使用 LU 分解或 LDL' 分解求解 b。

4

3 回答 3

10

您可以(并且应该!)使用LU 分解而不是显式反转矩阵:使用分解求解C x = b比计算C^-1和乘以向量具有更好的数值属性b

由于您的矩阵是对称的,因此 LU 分解实际上等效于LDL* 分解,这是您实际应该使用的。由于您的矩阵也是正定的,因此您应该能够在不旋转的情况下执行此分解。


编辑:请注意,对于此应用程序,您不需要解决全部C x = b问题。

相反,给定C = L D L*和差分向量v = a-b求解L* y = vy这是完整 LU 求解器的一半工作量)。

然后,y^t D^-1 y = v^t C^-1 v可以在线性时间内计算。

于 2012-08-02T20:56:10.010 回答
10

第一马氏距离 (MD) 是关于两个向量测量中不确定性的规范距离。当 时C=Indentity matrix,MD 减少到欧几里得距离,因此乘积减少到向量范数。此外,对于所有非零向量,MD 始终为正定或大于零。By your formulation with the appropriate choice of the vectors aand b, a*C^-1*bcan be less than zero. 希望您正在寻找的向量的不同之处在于x=(a-b)计算向量的转置在x^t*C^-1*x哪里。另请注意, 由于您的矩阵是对称且正定的,因此您可以利用 Cholesky 分解,它使用一半的运算作为 LU,并且在数值上更稳定。x^txMD=sqrt(x^t*C^-1*x)(MatLab-chol)chol(C)=L其中C=L*L^twhereL是下三角矩阵,L^tL使其成为上三角矩阵的转置。你的算法应该是这样的

(Matlab)

  x=a-b;
  L=chol(C); 
  z=L\x; 
  MD=z'*z; 
  MD=sqrt(MD);
于 2012-08-03T16:06:41.487 回答
0
# Mahalanobis Distance Matrix

import numpy as np
from scipy.spatial import distance
from scipy.spatial.distance import mahalanobis
from scipy.spatial.distance import pdist
from scipy.spatial.distance import squareform

# Example
Data = np.array([[1,2],[3,2],[4,3]])
Cov = np.cov(np.transpose([[1,2],[3,2],[4,3]]))
invCov = np.linalg.inv(Cov)

Y = pdist(Data, 'mahalanobis', invCov)
MD = squareform(Y) 
于 2021-12-18T11:04:07.137 回答