SVD分解原理
一个m*n的矩阵A,把他分解成如下形式:
分解例子如下:
作用:可用来解超定方程
例:左边为超定方程,右边为矩阵形式
于是对于齐次线性方程,如果列满秩且,则该方程组为超定方程组(有效方程个数大于未知参数的个数的方程)。此时的方程组没有精确解,需要求解最小二乘解。在的约束条件下下,其最小二乘解为矩阵的最小特征值所对应的特征向量。
利用代码求解:
import numpy as np
#输入系数矩阵A
A = np.array([[2,4,-11],[3,-5,-3],[1,2,-6],[2,1,-7]])
#对A进行svd分解
U,Sigma,VT = np.linalg.svd(A)
#print(U)
#print(Sigma)
#print(VT)
#求解,V的列向量即是ATA的特征向量
#VT最后一行的行向量即为最小特征值对应的特征向量
#由于x[3,0]=1,所以需要对结果进行处理
k=1/ VT[2,2]
x_1=VT[2,0]*k
x_2=VT[2,1]*k
print(x_1,x_2)
#误差
X=np.array([[x_1],[x_2],[1]])
R=np.dot(np.transpose(np.dot(A,X)),(np.dot(A,X)))
print (R)
运行结果:
解得最小二乘解为,误差平方和 。
至于为什么解是Vt矩阵最后一行的除法,而误差平方根这么算就不清楚了。
转载来源:
【MQ笔记】SVD分解练习(Python)(矩阵分解,图像处理,求解超定方程)_M&Q的博客-CSDN博客_矩阵分解图像处理