Аналіз проблеми
SVD матриці ніколи не є унікальним. Нехай матриця має розміри і її SVD будеAn×k
A=UDV′
для матриці з ортонормальними стовпцями, діагональної матриці з негативними записами та матриці з ортонормальними стовпцями.n×pUp × pDk × pV
Тепер вибрати, довільно , будь діагоналі матриця , що має s по діагоналі, так що є тотожність . Тодіp × pS±1S2=Ip×pIp
A=UDV′=UIDIV′=U(S2)D(S2)V′=(US)(SDS)(VS)′
також СВД з тому , що демонструє має ортонормированном стовпці і подібний розрахунок демонструє, що має ортонормальні стовпці. Більше того, оскільки і є діагональними, вони рухаються, тому показує, що все ще має негативні записи.A
(US)′(US)=S′U′US=S′IpS=S′S=S2=Ip
USVSSDSDS=DS2=D
D
Метод, реалізований в коді для пошуку SVD, знаходить , діагоналізує і, аналогічно, який діагоналізує Він переходить до обчислення за власними значеннями, знайденими в . Проблема полягає в наступному не гарантує послідовне узгодження стовпців за допомогою стовпців .U
AA′=(UDV′)(UDV′)′=UDV′VD′U′=UD2U′
VA′A=VD2V′.
DD2UV
Вирішення
Натомість, знайшовши такий та такий , використовуйте їх для обчисленняUV
U′AV=U′(UDV′)V=(U′U)D(V′V)=D
безпосередньо та ефективно. Діагональні значення цього необов'язково позитивні. D (Це тому, що немає нічого про процес діагоналізації або або що гарантуватиме це, оскільки ці два процеси здійснювались окремо.) Зробіть їх позитивними, вибравши записи по діагоналі дорівнювати знакам записів , так що має всі позитивні значення. Компенсуйте це, помноживши право на на :A′AAA′SDSDUS
A=UDV′=(US)(SD)V′.
Це SVD.
Приклад
Нехай при . SVD єn=p=k=1A=(−2)
(−2)=(1)(2)(−1)
з , і .U=(1)D=(2)V=(−1)
Якщо ви діагоналізуєте то, природно, виберете і . Аналогічно, якщо ви діагоналізуєте ви вибрали б . На жаль, Натомість обчисліть Оскільки це негативно, встановіть . Це налаштовує до і до . Ви отримали який є одним з двох можливих SVD (але не такий, як оригінал!).A′A=(4)U=(1)D=(4–√)=(2)AA′=(4)V=(1)
UDV′=(1)(2)(1)=(2)≠A.
D=U′AV=(1)′(−2)(1)=(−2).
S=(−1)UUS=(1)(−1)=(−1)DSD=(−1)(−2)=(2)A=(−1)(2)(1),
Код
Тут модифікований код. Його результат підтверджує
- Метод відтворює
m
правильно.
- U і дійсно все ще є ортонормальними.V
- Але результат не той самий SVD, який повернув
svd
. (Обидва однаково дійсні.)
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