SVD求解超定方程
超定方程
线性方程\(Ma=b\),其中\(M_{m*n},a_{n*1},b_{m*1}\),当m>n,方程没有精确的解,称之为超定方程.
SVD
任何矩阵\(A\)都可以写成\(UDV^{T}\),且U,V都是正交矩阵,正交矩阵有如下性质:
\[ A*A^{T}=A^{T}*A=I \qquad \Rightarrow \qquad A^{-1}=A^{T} \]
以下是用SVD求解的过程:
代码
有了上面的公式其实代码就很好写了,不过小编还是贴出来吧: 12345678910111213141516def svd(M,b): # numpy svd 工具求得的d是一个只有奇异值的向量,而不是公式中的矩阵 u,d,v = np.linalg.svd(M) c = np.dot(u.T,b) # 接下来是真正求得公式中的d tmp=np.zeros((M.shape[0],M.shape[1])) for i in range(0,len(d)): tmp[i][i]=d[i] d=tmp for i in range(0,d.shape[0]): for j in range(0,d.shape[1]): if(d[i][j]!=0): d[i][j]=1/d[i][j] w=d.T.dot(c) a = np.dot(v.T,w) return a