使用曲线拟合数据时,协方差矩阵的方差太大

2024-06-25 06:33:57 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图用曲线拟合来拟合数据时,我遇到了一些麻烦。在

首先,我有太大的方差,我从协方差矩阵得到:对于一些发现的参数,标准误差的相对大小超过100%。然而,拟合曲线很好地拟合了数据,但是如果我给参数指定协方差矩阵中显示的偏差,曲线将严重偏离。如果我降低拟合数据的多项式次数,方差就会变小。但曲线对数据的影响更大。另一件让我困惑的事情是,最初对参数的猜测并没有改善这种情况。在

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit 

#experimental_data
x=np.array([1842., 1885., 2149., 2164., 2195., 2208., 2234., 2254., 2266., 2284., 2292., 2315., 2334., 2350., 2361., 2381., 2387., 2427., 2435., 2458., 2484., 2498., 2563., 2592.,  830.,  269., 1498.,1918., 2100., 2112., 2312.])
y=np.array([5336., 5401., 5852., 5882., 5945., 5976., 6030., 6074., 6096., 6143., 6164., 6217., 6267., 6305., 6334., 6383., 6402., 6507., 6533., 6599., 6678., 6717., 6929., 7032., 4358., 4047., 4916., 5461., 5770., 5791., 6234.])

#fitting_function
def f_fit(x,a,b,c,d,g):
    return a*x**4+b*x**3+c*x**2+d*x+g

X=np.linspace(min(x),max(x))
popt, pcov = curve_fit(f = f_fit, xdata= x, ydata=y)
plt.figure(figsize=(10,7))
plt.plot(x,y, 'x') #experimental_data
plt.plot(X,f_fit(X, *popt))

perr=np.sqrt(np.diag(pcov)) #standard errors
#perturbed plots
plt.plot(X,f_fit(X, *popt+perr))
plt.plot(X,f_fit(X, *popt-perr))

That's what i get

第二,如果我加上absoulute_sigma=True,我得到的绘图偏差要小得多。但这对我来说毫无意义。在最小二乘法中,我们通常不知道ydata中的不确定性,但大多数情况下它是正确的。我不明白为什么加上absoulute_sigma=True会使方差小得多。在

popt, pcov = curve_fit(f = f_fit, xdata= x, ydata=y)将我引向这样的情节:

Absolute_sigma=True

对不起,如果我的问题是原始的,我只是这个问题的初学者。在


Tags: 数据import参数plotnpplt曲线fit
1条回答
网友
1楼 · 发布于 2024-06-25 06:33:57

curve_fit()估计参数值及其协方差,并且

perr = np.sqrt(np.diag(pcov)) 

提供a、b、c、d、g参数估计的标准误差

图中误差带的宽度由

^{pr2}$

等于

perr(a)*x^4 + perr(b)*x^3 + perr(c)*x^2+ perr(d)*x + perr(g)

首先,你可以看到,x越大,误差带越宽,即使参数被精确估计,perr值很小。因此,当x值较大时,误差带可能变得非常宽,因为多项式的高阶项非常大。下表显示了每个多项式项对X中每个值的标准误差带宽度的贡献,您可以清楚地看到,在较大的X值下,高阶项使误差带非常宽:

       perr(g)  perr(d)X  perr(c)X^2  perr(b)X^3 perr(a)X^4  f_fit(X, *perr)
X                       
269.00    22.84    27.38      9.390     1.23        0.06      60.90
316.41    22.84    32.20      13.00     2.01        0.11      70.15
363.82    22.84    37.03      17.18     3.05        0.18      80.29
...
...
2497.18   22.84   254.17     809.55   986.50      409.22    2482.27
2544.59   22.84   258.99     840.58  1043.76      441.19    2607.36
2592.00   22.84   263.82     872.19  1103.19      475.00    2737.04

因为你的参数是非常精确的估计,而且有些参数实际上是零-在你的例子中

popt = [ 1.23384779e-10, -4.87863958e-07,  9.15360533e-04, -8.15143637e-02, 4.01221128e+03]

以及

perr = [1.05233894e-11 6.33499440e-08 1.29819675e-04 1.01781887e-01 2.28383194e+01]

您可以从f_fit()中删除x^4和x^3项,这将有助于减少回归误差,而不会对曲线拟合造成实质性影响。在

关于绝对σ=True,仅当您指定sigma参数时,即当您有充分的理由对观察值应用权重时,才应使用此选项。在

相关问题 更多 >