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以使其正常工作,但是在更复杂的情况下,代码看起来会变得冗长和混乱.如果对这个问题有一个更清洁的解决方案,我真的很喜欢它.
谢谢!
不确定这是否更干净,但至少现在更容易为拟合功能添加更多参数.也许甚至可以从中做出更好的解决方案.
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)