当我试图用曲线拟合来拟合数据时,我遇到了一些麻烦。在
首先,我有太大的方差,我从协方差矩阵得到:对于一些发现的参数,标准误差的相对大小超过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))
第二,如果我加上absoulute_sigma=True
,我得到的绘图偏差要小得多。但这对我来说毫无意义。在最小二乘法中,我们通常不知道ydata中的不确定性,但大多数情况下它是正确的。我不明白为什么加上absoulute_sigma=True
会使方差小得多。在
popt, pcov = curve_fit(f = f_fit, xdata= x, ydata=y)
将我引向这样的情节:
对不起,如果我的问题是原始的,我只是这个问题的初学者。在
curve_fit()估计参数值及其协方差,并且
提供a、b、c、d、g参数估计的标准误差
图中误差带的宽度由
^{pr2}$等于
首先,你可以看到,x越大,误差带越宽,即使参数被精确估计,perr值很小。因此,当x值较大时,误差带可能变得非常宽,因为多项式的高阶项非常大。下表显示了每个多项式项对X中每个值的标准误差带宽度的贡献,您可以清楚地看到,在较大的X值下,高阶项使误差带非常宽:
因为你的参数是非常精确的估计,而且有些参数实际上是零-在你的例子中
以及
您可以从f_fit()中删除x^4和x^3项,这将有助于减少回归误差,而不会对曲线拟合造成实质性影响。在
关于绝对σ=True,仅当您指定sigma参数时,即当您有充分的理由对观察值应用权重时,才应使用此选项。在
相关问题 更多 >
编程相关推荐