如何将残差基准值的误差纳入最小化变量的误差计算?
解决方案:加权最小二乘与误差传播
当基准值(sol1、sol2、sol3)存在测量误差时,需通过加权最小二乘修正目标函数,同时基于加权后的海森矩阵逆计算变量x、y的误差,具体步骤如下:
1. 核心思路:加权最小二乘
基准值的误差越大,其对拟合结果的贡献应越小。我们给每个残差项分配权重(权重为对应基准值误差平方的倒数,即1/σ²),将目标函数修改为加权残差平方和,以此弱化误差较大的基准值对拟合的影响。
2. 修改后的完整代码
修正原代码的函数定义问题,并加入加权逻辑:
from scipy.optimize import minimize import numpy as np # 基准值及其误差 sol1 = 1 sol1_error = 0.5 sol2 = 2 sol2_error = 1 sol3 = 3 sol3_error = 1.5 def fun(k): x, y = k[0], k[1] a = x + y b = x - y c = x + 2*y # 加权残差平方和 residual = ((a - sol1)/sol1_error)**2 + ((b - sol2)/sol2_error)**2 + ((c - sol3)/sol3_error)**2 return residual # 执行最小化 min_result = minimize(fun, x0=(0, 0)) solution = min_result.x # 从海森矩阵逆中提取变量的方差,开平方得到标准差 cov_matrix = min_result.hess_inv x_error = np.sqrt(cov_matrix[0, 0]) y_error = np.sqrt(cov_matrix[1, 1]) print("求解结果:") print(f"x = {solution[0]:.4f} ± {x_error:.4f}") print(f"y = {solution[1]:.4f} ± {y_error:.4f}") print(f"加权残平方和:{min_result.fun:.4f}")
3. 误差计算原理
加权最小二乘的目标函数对应的海森矩阵近似为 H ≈ J^T W J,其中:
J是残差关于x、y的雅可比矩阵W是对角权重矩阵,元素为1/σ_i²
Scipy的minimize返回的hess_inv是海森矩阵的逆矩阵,它直接对应拟合变量x、y的协方差矩阵。协方差矩阵的对角线元素即为变量的方差,开平方后得到的就是变量的标准差(即你需要的误差范围)。
4. 结果说明
运行上述代码后,得到的x、y最优解及误差范围会合理反映基准值的不确定性:误差较大的基准值对拟合结果的影响被削弱,最终变量的误差也会更贴近实际数据的置信水平。
内容的提问来源于stack exchange,提问作者samman
相关产品推荐
相关产品推荐

