2.9 伪逆
计算公式
A+=VD+UTboldsymbol{A^+}= boldsymbol{V}boldsymbol{D^+}boldsymbol{U^T} A+=VD+UT
其中,矩阵 Uboldsymbol{U}U,Dboldsymbol{D}D和Vboldsymbol{V}V是矩阵 Aboldsymbol{A}A奇异值分解后得到的矩阵。
对角矩阵Dboldsymbol{D}D的伪逆D+boldsymbol{D^+}D+是其非零元素取倒数之后再转置得到的
值得注意的是,通过np.linalg.svd得到的vboldsymbol{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)