Mahalanobis-Abstand, der die Kovarianzmatrix umkehrt

8

Ich schreibe eine Funktion, um die Mahalanobis-Distanz zwischen zwei Vektoren zu nehmen. Ich verstehe, dass dies mit der Gleichung a * C ^ -1 * b erreicht wird, wobei a und b Vektoren sind und C die Kovarianzmatrix ist. Meine Frage ist, gibt es einen effizienten Weg, um das Inverse der Matrix ohne Gauss-Jordan-Eliminierung zu finden, oder gibt es keinen Weg um diese? Ich suche nach einer Möglichkeit, dies selbst zu tun, nicht mit irgendwelchen vordefinierten Funktionen.

Ich weiß, dass C eine hermitesche, positiv definite Matrix ist, also gibt es irgendeinen Weg, um diese Tatsache algorithmisch auszunutzen? Oder gibt es einen cleveren Weg, den Mahalanobis-Abstand zu berechnen, ohne das Gegenteil der Kovarianz zu berechnen? Jede Hilfe wäre willkommen.

*** Edit: Die obige Mahalanobis-Distanzgleichung ist falsch. Es sollte sein x '* C ^ -1 * x mit x = (b-a), und b und a sind die beiden Vektoren, deren Abstand wir zu finden versuchen (danke LRPurser). Die Lösung in der ausgewählten Antwort ist daher wie folgt:

d = x '* b, wobei b = C ^ -1 * x C * b = x, also löse für b die LU-Faktorisierung oder LDL-Faktorisierung.

    
Ataraxia 02.08.2012, 20:26
quelle

2 Antworten

9

Sie können (und sollten!) die LU-Zerlegung verwenden, anstatt die Matrix explizit zu invertieren: C x = b mit a lösen Die Zerlegung hat bessere numerische Eigenschaften als die Berechnung von C^-1 und die Multiplikation des Vektors b .

Da Ihre Matrix symmetrisch ist, entspricht eine LU-Zerlegung effektiv einer LDL * -zerlegung , was du eigentlich in deinem Fall verwenden solltest. Da Ihre Matrix ebenfalls positiv definit ist, sollten Sie in der Lage sein, diese Dekomposition ohne Pivotieren durchzuführen.

Bearbeiten: Beachten Sie, dass Sie für diese Anwendung nicht das vollständige C x = b -Problem lösen müssen.

Stattdessen geben Sie C = L D L* und den Differenzvektor v = a-b an und lösen L* y = v für y (das ist halb so viel Arbeit wie der vollständige LU-Solver).

Dann kann y^t D^-1 y = v^t C^-1 v in linearer Zeit berechnet werden.

    
comingstorm 02.08.2012, 20:56
quelle
8

Der erste Mahalanobis-Abstand (MD) ist der normierte Abstand in Bezug auf die Unsicherheit bei der Messung von zwei Vektoren. Wenn C=Indentity matrix , reduziert sich MD auf die euklidische Distanz und somit reduziert sich das Produkt auf die Vektornorm. MD ist für alle Nicht-Null-Vektoren immer positiv positiv oder größer als Null. Durch Ihre Formulierung mit der entsprechenden Wahl der Vektoren a und b kann a*C^-1*b kleiner als Null sein. Hoffentlich ist der Unterschied der Vektoren, nach denen Sie suchen, x=(a-b) , was die Berechnung x^t*C^-1*x ergibt, wobei x^t die Transponierte des Vektors x ist. Beachten Sie auch, dass MD=sqrt(x^t*C^-1*x) Da Ihre Matrix symmetrisch und positiv definit ist, können Sie die Cholesky-Dekomposition (MatLab-chol) verwenden, die die Hälfte der Operationen als LU verwendet und numerisch stabiler ist. chol(C)=L wobei C=L*L^t ist L ist eine untere Dreiecksmatrix und L^t ist die Transponierung von L , die es zu einem oberen Dreieck macht. Dein Algorithmus sollte ungefähr so ​​aussehen

(Matlab)

%Vor%     
LRPurser 03.08.2012 16:06
quelle

Tags und Links