Python2:使用scipy.optimize.curve_fit拟合函数的多参数和

时间:2019-04-10 10:24:24

标签: python curve-fitting least-squares

这是我关于Stack Overflow的第一篇文章,因此,如果缺少任何信息,请耐心等待。

我正在尝试使用带有scipy.optimize.curve_fit()的Python 2.7.15(ubuntu 18.04)通过数据拟合函数。这个拟合函数由可变指数的总和与相关参数组成,这些指数通过我的拟合函数的* args参数传递。

我尝试过将参数向量传递给拟合函数。不幸的是,似乎我使用“ for”循环执行的指数总和实际上被解释为numpy。 ndarray,应为单个值,以返回到拟合算法。 在下面找到我尝试过的(简化)示例:

import numpy as np
import scipy
import math
from scipy import optimize

# Fitting function:
def fitFuncTau(amplitude, nFit, t, *args):
    C0=args[0]
    C=list(args[1:(nFit+1)])
    tau=list(args[(nFit+1):(2*nFit+2)])
    sumFit=0
    for i in range(0, nFit):
        sumFit+=C[i]*np.exp(-t/tau[i])
    print sumFit
    return C0+amplitude*sumFit

#Fitting Args: C0 parameter, then two lists C[] and tau[] (size Nfit)
fitArgs=[1, 0.01, 0.01, 0.1, 0.1]
nFit=2
amplitude=1

# Dummy fitting data
x=np.linspace(0, 4, 100)
np.random.seed(1729)
y=np.random.normal(size=x.size)

#Fit
wrapFunc=lambda t, *args: fitFuncTau(amplitude, nFit, t, *args)
fit_opt, fit_cov = scipy.optimize.curve_fit(wrapFunc, x, y, p0=fitArgs)

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

尝试独立使用BigInteger max = list.stream().max(BigInteger::compareTo).get(); BigInteger min = list.stream().min(BigInteger::compareTo).get(); 函数。 fitFuncTau(或您想要提供的用于填充正确数量的参数的任何值)仅打印数字,而不是列表。

我找不到任何文档或参考资料来证明它,但是我想这只是fitFuncTau(1, 2, 3, 4, 5, 6, 7, 8)完成的打印优化。
由于curve_fit()的每个元素而引起的所有print调用都收集在一个列表中,并打印该列表。如果您检查打印列表的长度与x数组的长度相同(在您的情况下为100)。

它不应该影响拟合结果。检查x中的值是否合理。