本篇主要是记录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求解的过程:
svd

代码

有了上面的公式其实代码就很好写了,不过小编还是贴出来吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def 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