Ich versuche SVD von Hand zu machen:
m<-matrix(c(1,0,1,2,1,1,1,0,0),byrow=TRUE,nrow=3)
U=eigen(m%*%t(m))$vector
V=eigen(t(m)%*%m)$vector
D=sqrt(diag(eigen(m%*%t(m))$values))
U1=svd(m)$u
V1=svd(m)$v
D1=diag(svd(m)$d)
U1%*%D1%*%t(V1)
U%*%D%*%t(V)
Die letzte Zeile kehrt jedoch nicht m
zurück. Warum? Es scheint etwas mit Anzeichen dieser Eigenvektoren zu tun zu haben ... Oder habe ich das Verfahren falsch verstanden?
r
svd
eigenvalues
gescheiterter Statistiker
quelle
quelle
D=diag(c(-1,1,1)*sqrt(eigen(m%*%t(m))$values))
funktioniert, und denken Sie daran, dass die Quadratwurzel (sowie jeder normalisierte Eigenvektor) nur bis zum Vorzeichen definiert ist. Um weitere Informationen zu erhalten, ändern Siem
diesem <- matrix(-2,1,1)
und schließen Sie sie,1,1)
am Ende jedes Aufrufs an eindiag
. Dies ist ein Beispiel, das das gleiche Problem verursacht - aber es ist so einfach, dass die Art des Problems völlig offensichtlich wird.c(-1,1,1)
funktioniert, aber soD
definiert keine singulären Werte liefert . Singularwerte müssen per Definition alle positiv sein. Die Frage, wie man die Zeichen vonU
und verknüpft,V
ist gut, und ich habe keine Antwort. Warum machst du nicht einfach eine SVD? :-)Antworten:
Analyse des Problems
Die SVD einer Matrix ist niemals eindeutig. Die Matrix habe die Dimensionen n × k und ihre SVD seiA n×k
für eine Matrix U mit orthonormalen Spalten, eine diagonale p × p- Matrix D mit nicht negativen Einträgen und eine k × p- Matrix V mit orthonormalen Spalten.n×p U p×p D k×p V
Eine Lösung
Das ist eine SVD.
Beispiel
Code
Hier ist Code geändert. Seine Ausgabe bestätigt
m
korrekt neu erstellt .svd
. (Beide sind gleichermaßen gültig.)quelle
U
oder zu berechnenV
und dann eine andere Matrix durch Multiplikation mit zu erhaltenA
. Auf diese Weise führt man nur eine (anstelle von zwei) Eigendekompositionen durch, und die Vorzeichen werden richtig herauskommen.Wie ich in einem Kommentar zur Antwort von @ whuber dargelegt habe, funktioniert diese Methode zur Berechnung der SVD nicht für jede Matrix . Das Problem ist nicht auf Zeichen beschränkt.
eigen
Das Berechnen der SVD aus den beiden Eigendekompositionen ist ein großartiges Lernbeispiel, aber in realen Anwendungen wird immer die
svd
Funktion von R verwendet, um die Singularwertzerlegung zu berechnen.quelle
svd
funktioniert. In der Tat verwenden sie es als Standard, um eine Handberechnung zu vergleichen, deren Zweck es ist, das Verständnis zu überprüfen undsvd
in keiner Weise zu ersetzen .