Python2 : Fitting a multi-parameter sum of functions with scipy. 优化.curve_fit

标签 python curve-fitting least-squares

这是我在 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() 完成的打印优化。
由于 x 的每个元素而产生的所有 print 调用都收集在一个列表中,并打印该列表。如果您检查打印列表的长度与您的 x 数组相同(在您的情况下为 100)。

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

关于Python2 : Fitting a multi-parameter sum of functions with scipy. 优化.curve_fit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55610195/

相关文章:

Python曲线拟合使用相对偏差而不是绝对偏差进行优化

matlab - 从曲线外部用户给定的点查找曲线上的切点

algorithm - Matlab - 最小二乘数据拟合 - 具有额外约束的成本函数

python - 如何在 or-tools 中定义复杂的目标函数?

python - 仅在实际发生错误的情况下,如何仅将python错误(stderr)保存到日志文件?

python - 从登录我的 GAE 应用程序的用户发送电子邮件

python - 在 Python 中拟合分箱对数正态数据

matlab - 最小二乘法拟合参数

python - 基于标签的共现图像聚类

Python pyodbc 游标与数据库游标