这是我在Stack Overflow上的第一篇文章,所以如果缺少任何信息,请耐心等待。
我正在尝试使用Python 2.7.15(ubuntu 18.04)和scipy.optimize.curve_fit()通过数据拟合函数。此拟合函数由可变数量的指数和相关参数的总和组成,这些参数通过我的拟合函数的* 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)
任何帮助将非常感激!
尝试独立使用你的fitFuncTau
功能。 fitFuncTau(1, 2, 3, 4, 5, 6, 7, 8)
(或您想要提供的任何值来填充正确数量的参数)只打印一个数字,而不是列表。
我找不到任何文档或参考证明它,但我想这只是curve_fit()
完成的打印优化。
由于print
的每个元素而导致的所有x
调用都被收集在列表中并打印列表。如果检查打印列表的长度与x
数组相同(在您的情况下为100)。
它不应该影响拟合的结果。检查fit_opt
中的值是否合理。