Warum kann ich keine gültige SVD von X durch Eigenwertzerlegung von XX 'und X'X erhalten?


9

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 mzurück. Warum? Es scheint etwas mit Anzeichen dieser Eigenvektoren zu tun zu haben ... Oder habe ich das Verfahren falsch verstanden?



Mir wurde wiederholt gesagt, dass Zeichen in SVDs keine Rolle spielen ... so
gescheiterter Statistiker

@ Amoeba Danke, dass du das klargestellt hast. Ich habe mich eher auf die englische Frage als auf den Code konzentriert. Failedstatistician: Sehen Sie, was 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 Sie mdiese m <- matrix(-2,1,1)und schließen Sie sie ,1,1)am Ende jedes Aufrufs an ein diag. Dies ist ein Beispiel, das das gleiche Problem verursacht - aber es ist so einfach, dass die Art des Problems völlig offensichtlich wird. 1×1
whuber

1
Verstanden. Vielen Dank! Haben Sie eine allgemeine Regel zur Bestimmung des Vektors c (-1, 1, 1)? Oder wie sollen die Zeichen der beiden Zersetzung verknüpft werden?
Failedstatistician

1
Beachten Sie, dass der Trick von @ whuber mit c(-1,1,1)funktioniert, aber so Ddefiniert keine singulären Werte liefert . Singularwerte müssen per Definition alle positiv sein. Die Frage, wie man die Zeichen von Uund verknüpft, Vist gut, und ich habe keine Antwort. Warum machst du nicht einfach eine SVD? :-)
Amöbe

Antworten:


13

Analyse des Problems

Die SVD einer Matrix ist niemals eindeutig. Die Matrix habe die Dimensionen n × k und ihre SVD seiAn×k

A=UDV

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×pUp×pDk×pV

p×pS±1S2=Ip×pIp

A=UDV=UIDIV=U(S2)D(S2)V=(US)(SDS)(VS)

A

(US)(US)=SUUS=SIpS=SS=S2=Ip
USVSSD
SDS=DS2=D
D

U

AA=(UDV)(UDV)=UDVVDU=UD2U
V
AA=VD2V.
DD2UV

Eine Lösung

UV

UAV=U(UDV)V=(UU)D(VV)=D

DAAAASDSDUS

A=UDV=(US)(SD)V.

Das ist eine SVD.

Beispiel

n=p=k=1A=(2)

(2)=(1)(2)(1)

U=(1)D=(2)V=(1)

AA=(4)U=(1)D=(4)=(2)AA=(4)V=(1)

UDV=(1)(2)(1)=(2)A.
D=UAV=(1)(2)(1)=(2).
S=(1)UUS=(1)(1)=(1)DSD=(1)(2)=(2)
A=(1)(2)(1),

Code

Hier ist Code geändert. Seine Ausgabe bestätigt

  1. Die Methode wird mkorrekt neu erstellt .
  2. UV
  3. Das Ergebnis ist jedoch nicht dieselbe SVD, die von zurückgegeben wurde svd. (Beide sind gleichermaßen gültig.)
m <- matrix(c(1,0,1,2,1,1,1,0,0),byrow=TRUE,nrow=3)

U <- eigen(tcrossprod(m))$vector
V <- eigen(crossprod(m))$vector
D <- diag(zapsmall(diag(t(U) %*% m %*% V)))
s <- diag(sign(diag(D)))  # Find the signs of the eigenvalues
U <- U %*% s              # Adjust the columns of U
D <- s %*% D              # Fix up D.  (D <- abs(D) would be more efficient.)

U1=svd(m)$u
V1=svd(m)$v
D1=diag(svd(m)$d,n,n)

zapsmall(U1 %*% D1 %*% t(V1)) # SVD
zapsmall(U %*% D %*% t(V))    # Hand-rolled SVD
zapsmall(crossprod(U))        # Check that U is orthonormal
zapsmall(tcrossprod(V))       # Check that V' is orthonormal

1
+1. Das ist sehr klar. Ich würde nur hinzufügen, dass es in der Praxis ausreicht, entweder Uoder zu berechnen Vund dann eine andere Matrix durch Multiplikation mit zu erhalten A. Auf diese Weise führt man nur eine (anstelle von zwei) Eigendekompositionen durch, und die Vorzeichen werden richtig herauskommen.
Amöbe

2
@Amoeba Das ist richtig: Im Sinne der Handberechnung einer SVD, die offensichtlich eine pädagogische Übung ist, wird hier der Effizienz keine Aufmerksamkeit geschenkt.
whuber

2
Danke für deine freundliche Hilfe! Ich glaube, ich verstehe dieses Problem (endlich).
Failedstatistician

3
@ Federico Danke für diese Erinnerung. Sie haben ganz recht - ich habe implizit angenommen, dass alle Eigenwerte unterschiedlich sind, denn dies wird in statistischen Anwendungen mit ziemlicher Sicherheit der Fall sein, und man hat die Gewohnheit, die Mehrdeutigkeiten mit "entarteten" Eigenräumen zu berücksichtigen.
whuber

3
UV

5

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.

AAAAUVA=[3/54/54/53/5]AA=AA=IIeigenU=V=IUAV=A

UV

AAAAAA2uu2×1016108

Das Berechnen der SVD aus den beiden Eigendekompositionen ist ein großartiges Lernbeispiel, aber in realen Anwendungen wird immer die svdFunktion von R verwendet, um die Singularwertzerlegung zu berechnen.


1
Dieser Kommentar ist ein guter Rat. Bitte beachten Sie jedoch, dass dieser Thread nicht über die richtige Methode zur Berechnung der SVD besorgt ist (und ich glaube, niemand würde gegen Ihre Empfehlung argumentieren). Das OP akzeptiert implizit, dass dies svdfunktioniert. In der Tat verwenden sie es als Standard, um eine Handberechnung zu vergleichen, deren Zweck es ist, das Verständnis zu überprüfen und svdin keiner Weise zu ersetzen .
whuber

@whuber Richtige Beobachtung; Ich habe den letzten Absatz umformuliert.
Federico Poloni
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.