如何在曲线拟合时将误差包含在输入数组中

0 投票
2 回答
1046 浏览
提问于 2025-04-18 05:19

评论:我在这里输入大部分的函数。

假设我有这个数据集

X                Y                Err
1.75000000e+00   1.35782019e+03   5.30513124e-01  
1.50000000e+00   1.35253305e+03   5.30038166e-01
1.25000000e+00   1.34828730e+03   3.74007356e-01
1.00000000e+00   1.34305172e+03   6.01032718e-01
7.50000000e-01   1.33856734e+03   4.10658016e-01
5.00000000e-01   1.33354481e+03   3.75859437e-01
2.50000000e-01   1.32768190e+03   6.87483944e-01
0.00000000e+00   1.32243488e+03   1.01751280e+00

我可以用几种方法来进行拟合(使用Python)。polyfit(X,Y,1) 只返回斜率和截距,没有误差估计。scipy.optimize.curve_fit(linear_func,X,Y) 返回

(array([   20.03165298,  1322.9624529 ]), array([[ 0.08707502, -0.07619064],
   [-0.07619064,  0.09523831]]))

其中 linear_func(X,a,b) 返回 (a*X+b),这意味着斜率和截距的误差都是0.09,这个值考虑到我测量的误差来说太低了。我把误差作为权重包含进去(这是我找到的唯一包含误差的方法),scipy.optimize.curve_fit(linear_func,X,Y,sigma=1/E) 结果是

(array([   20.30379913,  1322.49139001]), array([[ 0.02571288, -0.00776912],
   [-0.00776912,  0.00959137]]))

这里的误差甚至更小。四处查找后,我发现了 statsmodel,它使用 OLS 得到的结果是

                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const       1322.9625      0.309   4286.883      0.000      1322.207  1323.718
x1            20.0317      0.295     67.884      0.000        19.310    20.754

看起来合理,虽然有点小。

最后,使用 WLS 得到的结果是

                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const       1323.2200      0.337   3928.369      0.000      1322.396  1324.044
x1            19.8639      0.314     63.234      0.000        19.095    20.633

大致相同。

所以,我的问题是,这两种方法有什么区别(我假设 OLSWLScurve_fit 的加权误差是一样的)?有没有办法手动估计拟合参数的误差?

2 个回答

0

OLS和curve_fit在没有权重的情况下,假设每个观察值的误差方差是相同的。

curve_fitWLS则假设你的误差方差是和你给的权重的倒数成正比的。你指定的权重的绝对值并不会影响参数的标准误差,只有权重的相对大小才是重要的。

scipy的curve_fit最近增加了一个选项absolute_sigma=False,如果设置为真,就会把权重的倒数当作绝对值来使用,而不是相对大小。

从问题来看,我不太确定这是否是相关的答案。

在线性模型中,假设是y = X * beta + u,其中u是误差,假设这些误差彼此独立,但方差是变化的,计算方式是sig2_u / weights

sig2_u是从实际残差或估计误差中估算出的总体方差。

absolute_sigma=True意味着我们将sig2_u设为1,而不是从拟合的回归中进行估算。

0

Yotam,你写道

scipy.optimize.curve_fit(linear_func,X,Y) returns

(array([   20.03165298,  1322.9624529 ]), array([[ 0.08707502, -0.07619064],
   [-0.07619064,  0.09523831]]))

where linear_func(X,a,b) returns (a*X+b) this mean that the error both in 
the slope and intercept is 0.09 which is too low considering the error I 
have in the measurement.

这不对。curve_fit()返回的第二个部分是协方差矩阵,所以估计的不确定性应该是sqrt(0.087075)和sqrt(0.0952383),大约是0.3,这个值更接近正确的范围,特别是因为这些值是1-sigma值,而不是3-sigma值。

关于权重的含义和使用absolute_sigma的其他评论也适用。

撰写回答