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?
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 m
diese 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.
c(-1,1,1)
funktioniert, aber so D
definiert keine singulären Werte liefert . Singularwerte müssen per Definition alle positiv sein. Die Frage, wie man die Zeichen von U
und verknüpft, V
ist gut, und ich habe keine Antwort. Warum machst du nicht einfach eine SVD? :-)