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)