Ein häufiges Problem in der Statistik ist die Berechnung der Quadratwurzel einer symmetrischen positiven definitiven Matrix. Was wäre der effizienteste Weg, dies zu berechnen?
Ich bin auf Literatur gestoßen (die ich noch nicht gelesen habe) und habe hier zufälligen R-Code gefunden , den ich hier der Einfachheit halber wiedergeben werde
# 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))
}
Ich bin nicht ganz sicher, ob ich die Zeile verstehe d = (d+abs(d))/2
. Gibt es eine effizientere Methode zur Berechnung der Quadratwurzel-Inversen? Die R- eigen
Funktion ruft LAPACK auf .
linear-algebra
numerical-analysis
matrix
tchakravarty
quelle
quelle
d[d<0] = 0
, was aussagekräftiger ist.Antworten:
Die Aussage
d = (d + abs (d)) / 2
quelle
Nach meiner Erfahrung funktioniert die Polar-Newton-Methode von Higham viel schneller (siehe Kapitel 6 der Funktionen von Matrizen von N. Higham). In dieser kurzen Notiz von mir gibt es Diagramme, die diese Methode mit Methoden erster Ordnung vergleichen. Es werden auch Zitate zu mehreren anderen Matrix-Quadratwurzel-Ansätzen vorgestellt, obwohl meistens die polare Newton-Iteration am besten zu funktionieren scheint (und es vermeidet, Eigenvektorberechnungen durchzuführen).
quelle
Optimieren Sie Ihren Code:
Option 1 - Optimieren Sie Ihren R-Code:
a. Du kannst
apply()
eine Funktion dazud
sowohlmax(d,0)
als auchd2[d==0]=0
in einer Schleife ausführen.b. Versuchen Sie es
ei$values
direkt weiter.Option 2 - Verwenden Sie C ++:
Schreiben Sie die gesamte Funktion in C ++ mit
RcppArmadillo
. Sie können es weiterhin von R aus anrufen.quelle