Częstym problemem w statystyce jest obliczanie pierwiastka kwadratowego odwrotnego symetrycznej dodatniej macierzy określonej. Jaki byłby najbardziej efektywny sposób obliczenia tego?
Natknąłem pewnym literaturze (które nie zostały jeszcze przeczytane) oraz jakiegoś przypadkowego kodu R tutaj , które będę tutaj dla wygody odtworzenia
# function to compute the inverse square root of a matrix
fnMatSqrtInverse = function(mA) {
ei = eigen(mA)
d = ei$values
d = (d+abs(d))/2
d2 = 1/sqrt(d)
d2[d == 0] = 0
return(ei$vectors %*% diag(d2) %*% t(ei$vectors))
}
Nie jestem do końca pewien, czy rozumiem tę linię d = (d+abs(d))/2
. Czy istnieje bardziej skuteczny sposób obliczania odwrotności pierwiastka kwadratowego macierzy? Funkcja R eigen
wywołuje LAPACK .
linear-algebra
numerical-analysis
matrix
tchakravarty
źródło
źródło
d[d<0] = 0
, co jest bardziej wyraziste.Odpowiedzi:
W opublikowanym kodzie zastosowano rozkład wartości własnej macierzy symetrycznej do obliczenia .ZA- 1 / 2
Wyrok
d = (d + abs (d)) / 2
efektywnie przyjmuje wszelkie ujemne wpisy id i ustawia je na 0, pozostawiając nieujemne wpisy w spokoju. Oznacza to, że każda ujemna wartość własna jest traktowana tak, jakby wynosiła 0. Teoretycznie wartości własne A powinny być nieujemne, ale w praktyce często zdarza się widzieć małe ujemne wartości własne podczas obliczania wartości własnych z rzekomo pozytywnego określonego macierz kowariancji, która jest prawie pojedyncza.ZA
Jeśli naprawdę potrzebujesz odwrotności pierwiastka kwadratowego z macierzy symetrycznej , a jest dość małe (nie większe niż powiedzmy 1000 na 1000), to jest to tak dobra jak każda metoda, której możesz użyć.ZA ZA
W wielu przypadkach można zamiast tego użyć współczynnika Cholesky'ego odwrotności macierzy kowariancji (lub praktycznie takiego samego, współczynnika Cholesky'ego samej macierzy kowariancji). Obliczanie współczynnika Cholesky'ego jest zwykle o rząd wielkości szybsze niż obliczanie rozkładu wartości własnej dla gęste matryce i znacznie bardziej wydajne (zarówno w czasie obliczeń, jak i wymaganym przechowywaniu) dla dużych i rzadkich matryc. Zatem zastosowanie faktoryzacji Choleskiego staje się bardzo pożądane, gdy jest duże i rzadkie.ZA
źródło
Z mojego doświadczenia wynika, że metoda Higham-biegunowa-Newtona działa znacznie szybciej (patrz Rozdział 6 Funkcji Matryc autorstwa N. Highama). W tej krótkiej notatce znajdują się wykresy porównujące tę metodę do metod pierwszego rzędu. Przedstawiono również cytowania kilku innych podejść do macierzy-pierwiastka kwadratowego, chociaż najlepiej wydaje się, że najlepiej działa biegunowa iteracja Newtona (i unika się wykonywania obliczeń wektorów własnych).
źródło
Zoptymalizuj swój kod:
Opcja 1 - Zoptymalizuj swój kod R:
a. Można
apply()
funkcja celud
, który będzie zarównomax(d,0)
id2[d==0]=0
na jednej pętli.b. Spróbuj operować
ei$values
bezpośrednio.Opcja 2 - użyj C ++:
Przepisz całą funkcję w C ++ za pomocą
RcppArmadillo
. Nadal będziesz mógł zadzwonić do niego z R.źródło