10

2つのベクトル間のマハラノビス距離を取る関数を書いています。これは、方程式a'* C ^ -1 * bを使用して達成されることを理解しています。ここで、aとbはベクトルで、Cは共分散行列です。私の質問は、ガウスの消去法を使用せずに行列の逆行列を見つける効率的な方法はありますか、それともこれを回避する方法はありませんか?事前定義された関数ではなく、自分でこれを行う方法を探しています。

Cがエルミートの正定行列であることを知っているので、この事実をアルゴリズムで利用できる方法はありますか?または、共分散の逆数をまったく計算せずにマハラノビス距離を計算する賢い方法はありますか?どんな助けでもいただければ幸いです。

***編集:上記のマハラノビス距離の式は正しくありません。x'* C ^ -1 * xである必要があります。ここで、x =(ba)であり、bとaは、距離を見つけようとしている2つのベクトルです(LRPurserに感謝)。したがって、選択した回答に示されている解決策は次のとおりです。

d = x'* b、ここでb = C ^ -1 * x C * b = xなので、LU分解またはLDL'分解を使用してbを解きます。

4

3 に答える 3

10

行列を明示的に反転する代わりに、 LU分解を使用できます(そして使用する必要があります)。分解を使用して解くと、ベクトルを計算して乗算するC x = bよりも優れた数値プロパティが得られます。C^-1b

行列は対称であるため、LU分解は実質的にLDL *分解と同等です。これは、実際に使用する必要があるものです。行列も正定値であるため、ピボットせずにこの分解を実行できるはずです。


編集:このアプリケーションでは、問題全体を解決する必要はないことに注意してくださいC x = b

代わりに、与えられたC = L D L*差分ベクトルをv = a-b解きます(これは完全なLUソルバーの半分の作業です)。L* y = vy

次に、y^t D^-1 y = v^t C^-1 v線形時間で計算できます。

于 2012-08-02T20:56:10.010 に答える
10

First Mahalanobis Distance(MD)は、2つのベクトルの測定の不確かさに関する標準距離です。の場合C=Indentity matrix、MDはユークリッド距離に減少し、したがって積はベクトルノルムに減少します。また、MDは常に正定値であるか、すべての非ゼロベクトルに対してゼロより大きいです。ベクトルabの適切な選択を使用した定式化により、a*C^-1*bはゼロ未満になる可能性があります。うまくいけば、あなたが探しているベクトルの違いは、ベクトルの転置である計算x=(a-b)を行うことです。また、行列は対称で正定値であるため、操作の半分をLUとして使用し、数値的に安定して いるコレスキー分解を利用できることにも注意してください。x^t*C^-1*xx^txMD=sqrt(x^t*C^-1*x)(MatLab-chol)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);
于 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 に答える