Ручное вычисление псевдоинверсии из SVD в R выглядит неправильно?

#r #svd #matrix-inverse #matrix-decomposition

#r #svd #матрица-обратная #разложение матрицы

Вопрос:

 A<-matrix(c(4,5,5,6,4,3,6,11,31),nrow=3,ncol=3)

 B
B<-cov(A)
           [,1]        [,2]  [,3]
[1,]  0.3333333  -0.8333333   5.0
[2,] -0.8333333   2.3333333 -17.5
[3,]  5.0000000 -17.5000000 175.0

bsvd<-svd(B)

D<-diag(1/bsvd$d)
D
V<-bsvd$v
U<-bsvd$u
a<-V%*%D
a%*%t(U)
 a%*%t(U)
             [,1]         [,2]         [,3]
[1,] 3.420461e 15 1.954549e 15 9.772746e 13
[2,] 1.954549e 15 1.116885e 15 5.584426e 13
[3,] 9.772746e 13 5.584426e 13 2.792213e 12
pseudoinverse(B)
            [,1]       [,2]        [,3]
[1,]  0.32090310 -0.5583242 -0.06512408
[2,] -0.55832422  0.9714162  0.11302345
[3,] -0.06512408  0.1130235  0.01887380



  

Я не уверен, почему это дает мне разные ответы? Формула для псевдоинверсии — VDU ^ T из того, что я видел онлайн.

Комментарии:

1. Откуда вы берете pseudoinverse() функцию? Существует много разных значений этого термина, и они не обязательно совпадают для фактически сингулярных матриц, таких как B .

2. понял это отсюда rdocumentation.org/packages/corpcor/versions/1.6.9/topics /…

Ответ №1:

Установите D[3,3] <- 0 , то есть исключите нулевое собственное значение B из обратного, а затем пересчитайте VDU ^ T, и вы получите тот же ответ, что и pseudoinverse функция, которую вы используете.

Комментарии:

1. По какой-то причине я получаю разные значения для разных матриц. Иногда инверсии одинаковы, иногда нет. знаете ли вы, почему? это потому, что матрицы являются сингулярными?

2. могу привести вам другой пример, если хотите

3. Это будет то, какие собственные значения / векторы вы исключаете. Это не всегда будет третьим. Эта другая функция, вероятно, будет использовать некоторый допуск, и если собственное значение исходной матрицы меньше некоторого числа, то это собственное значение в 1/D будет установлено равным нулю.