python - 同时拟合python参数共享

标签 python curve-fitting least-squares data-fitting

我有六个数据集,我希望同时拟合所有六个数据集,其中两个参数在六个数据集之间通用,一个参数单独拟合。

我计划将一个简单的 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) 对于每个集合都是不同的。

我知道我必须连接数据集并以这种方式拟合它们。

如果有人可以提供任何建议或帮助,我相信这对我和社区都有好处。

最佳答案

因为我有类似的拟合问题,所以我制作了symfit来应对这种场景。所以我很抱歉无耻地推荐我自己的包裹,但我认为这对你很有帮助。它封装了曲线拟合,但提供了一个符号界面,使事情变得更容易。

你的问题可以这样解决:

from symfit import variables, parameters, Fit

xs = variables('x_1, x_2, x_3, x_4, x_5, x_6')
ys = variables('y_1, y_2, y_3, y_4, y_5, y_6')

a, b = parameters('a, b')
cs = parameters(', '.join('c_{}'.format(i) for i in range(1, 6)))

model_dict = {
    y: a * x**2 + b * x + c
        for x, y, c in zip(xs, ys, cs)
}

fit = Fit(model_dict, x_1=x1_data, x_2=x2_data, ..., y_1=y1_data, ..., sigma_y_1=y1_err, sigma_y_2=y2_err, ...)
fit_result = fit.execute()
print(fit_result)

查看文档了解更多信息: http://symfit.readthedocs.io/en/latest/fitting_types.html#global-fitting

附注为了对您的参数进行初始猜测,每个 Parameter 对象都带有一个保存初始猜测的 .value 属性。例如,a.value = -0.6

编辑: 以前需要一些额外的解决方法,这解释了下面的一些讨论。不过,我现在发布了一个新的 symfit 版本,上面的代码可以按预期运行。

关于python - 同时拟合python参数共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39987105/

相关文章:

python - Python Flask登录login_required重定向

python - DRF 中的推送通知

python - Plotly:如何为箱线图中的每个点分配唯一的名称?

python - 不知道如何用高斯Python拟合数据

scipy - SciPy:Minimumsq与Minimum_squares

python - Lorentzian scipy.optimize.leastsq 适合数据失败

python - 用数据框计算出现次数?

r - 如何在 R 中为我的数据拟合平滑曲线?

python - 将 3d sigmoid 拟合到数据

R 通过任意点绘制(abline + lm)最佳拟合线