Я пытаюсь сделать 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
обратно. Почему? Кажется, что-то связано с признаками этих собственных векторов ... Или я неправильно понял процедуру?
r
svd
eigenvalues
failedstatistician
источник
источник
D=diag(c(-1,1,1)*sqrt(eigen(m%*%t(m))$values))
делает и имейте в виду, что квадратный корень (как и любой нормализованный собственный вектор) определяется только с точностью до знака. Для получения более подробной информации, изменитеm
наm <- matrix(-2,1,1)
и включите,1,1)
в конце каждого из вызововdiag
. Это пример который создает ту же проблему - но он настолько прост, что природа проблемы станет совершенно очевидной.c(-1,1,1)
работает, ноD
определенный таким образом не дает вам единичные значения. Все значения в единственном числе должны быть положительными по определению. Вопрос о том, как связать признакиU
иV
хорош, а у меня нет ответа. Почему бы вам просто не сделать SVD? :-)Ответы:
Анализ проблемы
СВД матрицы никогда не бывает уникальным. Пусть матрица имеет размерыn × k, и пусть его SVD будетA n×k
для матрицы U с ортонормированными столбцами, диагональной p × p- матрицы D с неотрицательными элементами и k × p- матрицы V с ортонормированными столбцами.n×p U p×p D k×p V
Теперь произвольно выбираем любую диагональную матрицу S, имеющую ± 1 s на диагонали, так что S 2 = I является тождеством p × p I p . затемp×p S ±1 S2=I p×p Ip
Также СВД из А , потому что ( U S ) ' ( U S ) = S ' U ' U S = S ' Я р S = S ' S = S 2 = я р демонстрирует U S имеет ортонормированные столбцы и аналогичный расчет показывает V S имеет ортонормированные столбцы. Более того, поскольку S и D диагональны, они коммутируют, откудаA
Метод, реализованный в коде для поиска SVD, находит который диагонализирует A A ′ = ( U D V ′ ) ( U D V ′ ) ′ = U D V ′ V D ′ U ′ = U D 2 U ′ и, аналогично, A V, который диагонализирует A ' A = V D 2 V ' . Он продолжает вычислять DU
Решение
Вместо этого, после нахождения такого и такого V , используйте их для вычисленияU В
Это СВД.
пример
Код
Вот модифицированный код. Его вывод подтверждает
m
правильно.svd
. (Оба одинаково действительны.)источник
U
либоV
затем получить другую матрицу путем умножения наA
. Таким образом, каждый выполняет только одно (вместо двух) собственных разложений, и знаки получатся правильными.Как я отмечал в комментарии к ответу @ whuber, этот метод для вычисления SVD не работает для каждой матрицы . Вопрос не ограничивается знаками.
eigen
Вычисление SVD из двух собственных разложений является отличным примером обучения, но в реальных приложениях всегда используют
svd
функцию R для вычисления разложения по сингулярным числам.источник
svd
работает. Действительно, они используют его в качестве стандарта для сравнения ручного расчета, целью которого является проверка понимания, а не заменаsvd
в любом случае.