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?
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.
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? :-)