奇异值分解求解超定方程最小二乘解

奇异值分解求解超定方程最小二乘解

超定方程可以通过SVD奇异值分解来求解最小二乘解,分为两种:
1、Ax = 0
对于这个情况:

"""
Ax = 0
A = [[1, 2, 3],      x1
     [4, 5, 6],  *   x2    = 0
     ......
     [2, 3, 4]]      x3
"""
U, Sigma, VT = np.linalg.svd(A)
print(VT)
print(VT.T)

x1 = VT.T[0, 2]
x2 = VT.T[1, 2]
x3 = VT.T[2, 2]

即奇异值分解的V的转置的最后一列为所求解的值。
2、Ax = b
在这里插入图片描述

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)

参考参考

猜你喜欢

转载自blog.csdn.net/weixin_43151193/article/details/128494394
今日推荐