2.9 伪逆
计算公式
A
+
=
V
D
+
U
T
\boldsymbol{A^+}= \boldsymbol{V}\boldsymbol{D^+}\boldsymbol{U^T}
A+=VD+UT 其中,矩阵
U
\boldsymbol{U}
U,
D
\boldsymbol{D}
D和
V
\boldsymbol{V}
V是矩阵
A
\boldsymbol{A}
A奇异值分解后得到的矩阵。
对角矩阵
D
\boldsymbol{D}
D的伪逆
D
+
\boldsymbol{D^+}
D+是其非零元素取倒数之后再转置得到的
值得注意的是,通过np.linalg.svd得到的
v
\boldsymbol{v}
v矩阵是转置后的矩阵,所以在计算的时候需要再转置一次
实现代码
import numpy as np
data = np.random.normal(size=(4,5))
def get_inv(m):
u,s,v = np.linalg.svd(data)
sm = np.zeros(shape=(u.shape[0],v.shape[0]))
s = np.diag(s)
for i in range(u.shape[0]):
for j in range(v.shape[0]):
if (i<len(s) and j<len(s)):
sm[i][j] = s[i][j]
sm = np.where(sm!=0,1/sm,0)
return (v.T.dot(sm.T)).dot(u.T)
get_inv(data)
|