lov*_*eed 32 python curve-fitting scipy
在python中我有一个有很多参数的函数.我想将此函数适用于数据集,但只使用一个参数,我想要自己提供的其余参数.这是一个例子:
def func(x,a,b):
return a*x*x + b
for b in xrange(10):
popt,pcov = curve_fit(func,x1,x2)
Run Code Online (Sandbox Code Playgroud)
在这里我希望仅适用于拟合a,参数b采用循环变量的值.如何才能做到这一点?
Ant*_*zov 41
你可以func用lambda 包装,如下所示:
def func(x,a,b):
return a*x*x + b
for b in xrange(10):
popt,pcov = curve_fit(lambda x, a: func(x, a, b), x1, x2)
Run Code Online (Sandbox Code Playgroud)
lambda是一个匿名函数,在Python中只能用于简单的一行函数.基本上,它通常用于在不需要为函数指定名称时减少代码量.官方文档中给出了更详细的描述:http://docs.python.org/tutorial/controlflow.html#lambda-forms
在这种情况下,lambda用于修复其中一个参数func.新创建的函数只接受两个参数:x和a,而b固定为从局部b变量获取的值.然后将此新函数curve_fit作为参数传递.
更好的方法是使用lmfit,它为曲线拟合提供了更高级别的接口。在其他功能中,Lmfit 使拟合参数成为可以有边界或显式固定(以及其他功能)的一流对象。
使用 lmfit,这个问题可以这样解决:
from lmfit import Model
def func(x,a,b):
return a*x*x + b
# create model
fmodel = Model(func)
# create parameters -- these are named from the function arguments --
# giving initial values
params = fmodel.make_params(a=1, b=0)
# fix b:
params['b'].vary = False
# fit parameters to data with various *static* values of b:
for b in range(10):
params['b'].value = b
result = fmodel.fit(ydata, params, x=x)
print(": b=%f, a=%f+/-%f, chi-square=%f" % (b, result.params['a'].value,
result.params['a'].stderr,
result.chisqr))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17505 次 |
| 最近记录: |