【发布时间】:2016-12-06 20:19:41
【问题描述】:
我有六个数据集,我希望同时拟合所有六个数据集,六个数据集之间共有两个参数,一个单独拟合。
我打算为数据集拟合一个简单的 ax**2+bx+c 多项式,其中 a 和 b 在六个数据集之间共享,而偏移量 c 在六个数据集之间不共享。
因此,我在数据集之间拟合了一个公共斜率,但偏移量可变。
我完全有能力单独拟合它们,但是由于每个数据集之间的斜率相似,因此使用同时拟合将大大改善偏移量 c 的误差。
我通常使用 scipy.optmize.curve_fit 进行拟合。
import numpy as np
from scipy.optimize import curve_fit
def func(x,a,b,c):
return (a*(x**2)+b*x+c)
def fit(x,y,yerr):
popt, pcov = curve_fit(func,x,y,p0=[-0.6,5,-12],sigma=yerr)
chi=np.sum( ((func(x, *popt) - y) / yerr)**2)
redchi=(chi-1)/len(y)
return popt,pcov,redchi,len(y)
我正在处理 6 组:x,xerr,y,yerr 每个集合的 len(x) 和 len(y) 都不同。
我知道我必须连接数据集并以这种方式拟合它们。
如果有人可以提供任何建议或帮助,我相信这对我和社区都有好处。
【问题讨论】:
-
是 Python 问题还是数学问题?
-
你是说你将有六个值
c(比如c_1...c_6)和a和b各一个值,这样dataset_i 的模型将是a*x**2 + b*x + c_i? -
@inspectorG4dget 是的,a 和 b 在所有 6 个数据集中的拟合值相同,c 将有 6 个拟合值。
-
@Laurent LAPORTE,目前主要是python问题。有没有办法适应共享参数?你能把数据集放在一个矩阵中同时拟合它们吗?
-
我不知道如何用
scipy.curve_fit做到这一点,但我可以编写一个简单的双染色体遗传算法来做到这一点
标签: python curve-fitting least-squares data-fitting