Чому я не можу отримати дійсний SVD X через розкладання власних значень XX 'та X'X?


9

Я намагаюся зробити SVD вручну:

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)

Але останній рядок не повертається mназад. Чому? Здається, це має щось спільне з ознаками цих власних векторів ... Або я неправильно зрозумів процедуру?



Мені неодноразово говорили, що знак не має значення у СВД ... як це
невдалий статистик

@Amoeba Дякую за пояснення. Я зосереджувався на англійському питанні, а не на коді. Невдалий статистик: подивіться, що D=diag(c(-1,1,1)*sqrt(eigen(m%*%t(m))$values))означає, і майте на увазі, що квадратний корінь (як і будь-який нормалізований власний вектор) визначається лише до знаку. Для більшого розуміння, зміни mв m <- matrix(-2,1,1)і включають в себе ,1,1)в кінці кожного з дзвінків diag. Це приклад який створює ту саму проблему - але це так просто, що природа проблеми стане абсолютно очевидною. 1×1
whuber

1
Зрозумів. Дякую! Чи є у вас загальне правило визначення вектора c (-1, 1, 1)? Або як слід пов’язати ознаки двох розкладання?
невдалий статистик

1
Зауважте, що хитрість @ whuber із c(-1,1,1)справді працює, але Dвизначена як така не дає вам єдиних значень. Поодинокі значення повинні бути позитивними за визначенням. Питання про те, як пов’язати ознаки Uі Vце добре, і у мене немає відповіді. Чому ти просто не робиш SVD? :-)
амеба

Відповіді:


13

Аналіз проблеми

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)=SUUS=SIpS=SS=S2=Ip
USVSSD
SDS=DS2=D
D

Метод, реалізований в коді для пошуку SVD, знаходить , діагоналізує і, аналогічно, який діагоналізує Він переходить до обчислення за власними значеннями, знайденими в . Проблема полягає в наступному не гарантує послідовне узгодження стовпців за допомогою стовпців .U

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

Вирішення

Натомість, знайшовши такий та такий , використовуйте їх для обчисленняUV

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

безпосередньо та ефективно. Діагональні значення цього необов'язково позитивні. D (Це тому, що немає нічого про процес діагоналізації або або що гарантуватиме це, оскільки ці два процеси здійснювались окремо.) Зробіть їх позитивними, вибравши записи по діагоналі дорівнювати знакам записів , так що має всі позитивні значення. Компенсуйте це, помноживши право на на :AAAASDSDUS

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

Це SVD.

Приклад

Нехай при . SVD єn=p=k=1A=(2)

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

з , і .U=(1)D=(2)V=(1)

Якщо ви діагоналізуєте то, природно, виберете і . Аналогічно, якщо ви діагоналізуєте ви вибрали б . На жаль, Натомість обчисліть Оскільки це негативно, встановіть . Це налаштовує до і до . Ви отримали який є одним з двох можливих SVD (але не такий, як оригінал!).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),

Код

Тут модифікований код. Його результат підтверджує

  1. Метод відтворює mправильно.
  2. U і дійсно все ще є ортонормальними.V
  3. Але результат не той самий 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

1
+1. Це дуже зрозуміло. Я хотів би лише додати, що на практиці достатньо обчислити Uабо, Vі потім отримати іншу матрицю шляхом множення на A. Таким чином, виконується лише одна (замість двох) композицій, і знаки вийдуть правильно.
амеба

2
@Amoeba Це правильно: в дусі ручного обчислення SVD, що, очевидно, є навчальною вправою, тут не приділяється уваги ефективності.
whuber

2
Дякую за добру допомогу! Я думаю, що розумію це питання (нарешті).
невдалий статистик

3
@Federico Дякую за це нагадування. Ви цілком правильні - я неявно припускав, що всі власні величини є виразними, бо це справді майже напевно буде так у статистичних додатках, і виходить із звички розглядати неясності із «виродженими» власними просторами.
whuber

3
Ви праві, це лише крайній випадок, і справді хитрий. В якому - то сенсі, це ще один прояв тієї ж проблеми , що ви окреслити в своїй відповіді, що цей метод не забезпечує «узгодження» між стовпцями і . Обчислення SVD, починаючи з ейгендекомпозицій, все ще є чудовим прикладом навчання. UV
Федеріко Полоні

5

Як я зазначив у коментарі до відповіді @ whuber, цей метод для обчислення SVD працює не для кожної матриці . Питання не обмежується ознаками.

Проблема полягає в тому, що можуть бути повторні власні значення, і в цьому випадку ейгендекомпозиція і не є унікальною, і не всі варіанти і можуть бути використані для отримання діагонального коефіцієнта SVD. Наприклад, якщо взяти будь-яку недіагональну ортогональну матрицю (скажімо, ), тоді . Серед усіх можливих варіантів вибору для власних векторів матриці , поверне , таким чином , в цьому випадку НЕ по діагоналі.AAAAUVA=[3/54/54/53/5]AA=AA=IIeigenU=V=IUAV=A

Інтуїтивно це ще один прояв тієї ж проблеми, що @whuber окреслює, що між стовпцями і має бути "відповідність" , а обчислення двох ейгендекомпозицій окремо не забезпечує цього.UV

Якщо всі одиничні значення виразні, то ейгендекомпозиція є унікальною (аж до масштабування / ознак), і метод працює. Зауваження: все- таки не дуже гарно використовувати його у виробничому коді на комп'ютері з арифметикою з плаваючою комою, тому що при формуванні продуктів та обчислений результат може бути кількістю на порядок , де - машинна точність. Якщо величини сингулярних значень сильно відрізняються (більше , приблизно), це шкодить чисельній точності найменших.AAAAAA2uu2×1016108

Обчислення SVD з двох ейгендекомпозицій є чудовим прикладом навчання, але в реальному житті програми завжди використовують svdфункцію R для обчислення розкладання сингулярного значення.


1
Цей коментар є гарною порадою. Однак зауважте, що цей потік не стосується правильного способу обчислення SVD (і я вважаю, що ніхто не заперечуватиме проти вашої рекомендації). ОП неявно приймає, що svdпрацює. Дійсно, вони використовують його як стандарт, на підставі якого порівнюють підрахунок рук, метою якого є перевірка розуміння, а не заміна svdбудь-яким способом.
whuber

@whuber Правильне спостереження; Я переформулював останній абзац.
Федеріко Полоні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.