我正在写一个函数来计算两个向量之间的马氏距离。我知道这是使用方程a'*C^-1*b来实现的,其中a和b是向量,C是协方差矩阵。我的问题是,有没有一种有效的方法可以在不使用高斯-乔丹消元法的情况下找到矩阵的逆矩阵,或者没有办法绕过这一点?我正在寻找一种自己做这件事的方法,而不是使用任何预定义的函数。
我知道C是一个厄米特的,正定的矩阵,那么有什么方法可以让我在算法上利用这个事实呢?或者,有没有一些聪明的方法来计算马氏距离,而根本不计算协方差的逆?任何帮助都将不胜感激。
*编辑:上面的Mahalanobis距离公式不正确。它应该是x'*C^-1*x,其中x= (b-a),b和a是我们要找出其距离的两个向量(感谢LRPurser)。因此,在所选答案中提出的解决方案如下:
d=x'*b,其中b= C^-1*x C*b = x,因此使用LU分解或LDL‘分解来求解b。
发布于 2012-08-03 04:56:10
你可以(也应该!)使用LU decomposition而不是显式地求逆矩阵:使用分解求解C x = b比计算C^-1并将向量b相乘具有更好的数值属性。
因为您的矩阵是对称的,所以LU分解实际上等同于LDL* decomposition,这是您实际应该使用的情况。因为您的矩阵也是正定的,所以您应该能够在不旋转的情况下执行这种分解。
编辑:请注意,对于这个应用程序,您不需要解决整个C x = b问题。
相反,给定C = L D L*和差异向量v = a-b,为y解算L* y = v (其工作量是完整LU解算器的一半)。
然后,可以在线性时间内计算y^t D^-1 y = v^t C^-1 v。
发布于 2012-08-04 00:06:41
首先,马氏距离(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)分解(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);发布于 2021-12-18 11:04:07
# 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) https://stackoverflow.com/questions/11785201
复制相似问题