将元组作为scipy.optimize.curve_fit的输入参数传递

Yux*_*ang 8 python numpy curve-fitting scipy

我有以下代码:

import numpy as np
from scipy.optimize import curve_fit


def func(x, p): return p[0] + p[1] + x


popt, pcov = curve_fit(func, np.arange(10), np.arange(10), p0=(0, 0)) 
Run Code Online (Sandbox Code Playgroud)

它会引发TypeError:func()只需要2个参数(给定3个).嗯,这听起来很公平 - curve_fit使(0,0)不是两个标量输入.所以我尝试了这个:

popt, pcov = curve_fit(func, np.arange(10), np.arange(10), p0=((0, 0),))
Run Code Online (Sandbox Code Playgroud)

同样,它说:ValueError:对象太深,不适合所需的数组

如果我将其保留为默认值(不指定p0):

popt, pcov = curve_fit(func, np.arange(10), np.arange(10))  
Run Code Online (Sandbox Code Playgroud)

它会引发IndexError:标量变量的索引无效.显然,它只给p的函数标量.

我可以使def func(x,p1,p2):返回p1 + p2 + x以使其正常工作,但是在更复杂的情况下,代码看起来会变得冗长和混乱.如果对这个问题有一个更清洁的解决方案,我真的很喜欢它.

谢谢!

cas*_*ass 5

不确定这是否更干净,但至少现在更容易为拟合功能添加更多参数.也许甚至可以从中做出更好的解决方案.

import numpy as np
from scipy.optimize import curve_fit


def func(x, p): return p[0] + p[1] * x

def func2(*args):
    return func(args[0],args[1:])

popt, pcov = curve_fit(func2, np.arange(10), np.arange(10), p0=(0, 0))
print popt,pcov
Run Code Online (Sandbox Code Playgroud)

编辑:这对我有用

import numpy as np
from scipy.optimize import curve_fit

def func(x, *p): return p[0] + p[1] * x

popt, pcov = curve_fit(func, np.arange(10), np.arange(10), p0=(0, 0))
print popt,pcov
Run Code Online (Sandbox Code Playgroud)