从R中的SVD手动计算伪逆看起来不对吗?

问题描述

A<-matrix(c(4,5,6,4,3,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.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]        [,]  0.32090310 -0.5583242 -0.06512408
[2,] -0.55832422  0.9714162  0.11302345
[3,] -0.06512408  0.1130235  0.01887380



我不确定为什么这会给我不同的答案?根据我在网上看到的内容,伪逆的公式为VDU ^ T。

解决方法

设置D[3,3] <- 0,即从逆中排除B的零特征值,然后重新计算VDU ^ T,您将得到与正在使用的pseudoinverse函数相同的答案。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...