遇到问题现象描述
我利用五元一次方程(拟合一个曲线)正演了一组数据,这组数据拟合曲线非常好,然后利用目标曲线数据基于最小二乘法求解超定方程的解(5个未知数),求解结果与答案误差太大,我仔细检查了求解过程,方程系数矩阵等都没有问题,其它也没有找到错误原因。
问题相关代码片、运行结果、报错内容
x1,x2,x3,x4,x5 = np.linalg.lstsq(a,b,rcond=None)[0]
x3_err = 100*abs(x3_pre -x3_true)/abs(x3_true)
运行结果: x3_err = 400%
a是系数矩阵,b是正演的数据
我的初步解决思路
我想使用加权最小二乘重新求解,以后再实际应用中也要使用加权最小二乘算法,请求各位提供一个加权最小二乘的python代码(求解超定线性问题的解)。
操作环境、软件版本等相关信息
使用的python3.10版本
python
import numpy as np
# 定义加权最小二乘函数
def weighted_least_squares(A, b, w):
# 计算加权系数矩阵
W = np.diag(np.sqrt(w))
# 构造加权系数矩阵
A_tilde = np.dot(W, A)
b_tilde = np.dot(W, b)
# 求解加权最小二乘问题
x = np.linalg.lstsq(A_tilde, b_tilde, rcond=None)[0]
# 返回解
return x
# 示例数据
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]])
b = np.array([1, 2, 3, 4, 5])
w = np.array([1, 2, 3, 4, 5])
# 调用加权最小二乘函数
x = weighted_least_squares(A, b, w)
# 输出结果
print(x)
我引用ChatGPT作答:以下是一个基于numpy的加权最小二乘法Python代码示例,用于求解超定线性问题的解:
import numpy as np
def weighted_least_squares(A, b, w):
"""
求解加权最小二乘问题:最小化 || Aw - b ||_2^2,
其中 w 是未知向量,||.||_2 表示欧氏范数。
A 是设计矩阵,b 是观察向量,w 是未知向量。
w 使用以下公式计算:w = (A^T W A)^-1 A^T W b,其中 W 是对角线
权重矩阵。
"""
W = np.diag(w)
A_t = np.transpose(A)
w_A = np.matmul(W, A)
A_t_w_A = np.matmul(A_t, w_A)
A_t_w_b = np.matmul(A_t, np.multiply(w, b))
w = np.linalg.solve(A_t_w_A, A_t_w_b)
return w
# Example usage
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 10], [11, 12, 14]])
b = np.array([1, 2, 3, 4])
w = np.array([1, 2, 3, 4])
wls = weighted_least_squares(A, b, w)
print(wls)
在这个例子中,我们使用了一个4x3的系数矩阵A和长度为4的观测向量b,以及长度为4的权重向量w。函数weighted_least_squares计算了加权最小二乘解,我们将结果打印出来以检查代码是否正确。
最小二乘拟合问题求解算法(含python代码):https://blog.csdn.net/weixin_42075625/article/details/123576247
该回答引用ChatGPT GPT-4
运行结果
代码如下:
import numpy as np
# 构造超定方程组 A*x = b
A = np.array([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [1, 1, 1, 1, 1]])
b = np.array([1, 2, 3, 4])
# 使用SVD方法求解超定方程组
U, s, Vt = np.linalg.svd(A, full_matrices=False)
S_inv = np.diag(1/s)
x = Vt.T.dot(S_inv).dot(U.T).dot(b)
# 带L2范数的最小二乘法
lambda_ = 0.1 # 正则化参数
x_l2 = np.linalg.inv(A.T.dot(A) + lambda_*np.eye(A.shape[1])).dot(A.T).dot(b)
print("使用SVD方法求解的解为:", x)
print("带L2范数的最小二乘法的解为:", x_l2)
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
加权最小二乘法是最小化带权误差平方和的方法来求解超定线性问题的解。可以利用numpy中的函数 np.linalg.lstsq()实现加权最小二乘法求解。
下面是加权最小二乘法求解超定线性问题的解的Python代码:
import numpy as np
# a是系数矩阵,b是正演的数据
# weight是权重向量
def weighted_least_squares(a, b, weight):
w = np.sqrt(np.diag(weight))
a = np.dot(w, a)
b = np.dot(w, b)
x = np.linalg.lstsq(a, b, rcond=None)[0]
return x
在以上代码中,我们先利用权重向量weight来加权系数矩阵a和正演的数据b,然后再利用加权后的系数矩阵和数据进行加权最小二乘求解。最后返回解向量x。
您只需要将a,b和weight带入上述代码中即可得到加权最小二乘法求解超定线性问题的解。
希望我的回答对您有所帮助。
如果我的回答解决了您的问题,请采纳!
加权最小二乘
将最小二乘的残差取出来,绝对值后,再倒数后最为wls的权重。
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from scipy import stats
from statsmodels.iolib.table import SimpleTable, default_txt_fmt
np.random.seed(1024)
mod_wls = sm.WLS(y, X, weights=1.0 / abs(res_ols.resid))
res_wls = mod_wls.fit()
print(res_wls.summary())
可以借鉴下
https://blog.csdn.net/weixin_46277779/article/details/126743513
针对这个问题,可能会有以下几个原因导致:
数据量不够:如果数据点太少,拟合曲线可能会出现过拟合或欠拟合的情况,从而导致求解超定方程的解误差较大。
算法选择问题:最小二乘法是一种常用的拟合算法,但并不是适用于所有数据集,有些数据集可能需要使用更复杂的算法才能得到准确的结果。
数值计算精度问题:在计算机中进行数值计算时,由于浮点数的精度有限,可能会导致数值计算误差,从而导致求解超定方程的解误差较大。
数据噪声问题:如果数据集中存在噪声,可能会对拟合曲线和求解超定方程的解产生影响,导致误差较大。
对于这个问题,建议可以尝试以下几个方法:
增加数据量:可以尝试增加数据点,提高数据量,从而减少拟合误差和求解误差。
尝试其他算法:可以尝试其他的拟合算法或求解超定方程的方法,比如非线性拟合算法或广义逆矩阵求解超定方程等。
提高数值计算精度:可以尝试提高数值计算的精度,比如增加计算精度或使用更高精度的数据类型等。
数据预处理:可以对数据进行预处理,比如去噪等操作,减少数据噪声的影响。
最后,建议在求解过程中输出一些中间结果,比如方程系数矩阵、求解结果等,方便调试和查错。