【发布时间】:2020-02-12 12:11:02
【问题描述】:
我在尝试使用 curve_fit 拟合数据时遇到了一些麻烦。
首先,我从协方差矩阵中得到的方差太大:对于一些找到的参数,标准误差的相对幅度超过 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) 将我引向这样的情节:
对不起,如果我的问题很原始,我只是这方面的初学者。
【问题讨论】:
-
你问的是编程问题还是数学问题?
-
我真的不知道。这取决于我错在哪里:代码或数学。
-
作为测试,尝试“numpy,polyfit(x, y, 4)”,返回参数作为curve_fit()的初始参数。请注意,从 numpy 文档中 polyfit() 返回“多项式系数,最高功率优先”。
-
@JamesPhillips 我已经找到了初始参数,尽管方式略有不同。无论如何,拟合都不是问题;找到的曲线很好地拟合了数据。但是找到的参数的方差(以及因此的标准误差)仍然很大。这是主要问题。
-
我的意思是尝试这个作为测试。
标签: python curve-fitting least-squares variance