我想使用curve_fit
来填充一些数据。我有一个功能,如
def fitf(x,y,z=10):
return x*y+z
如果我想传递可选参数z
,该如何继续?现在我正在使用fift
周围的包装函数,例如
def fitff(x,y):
return fitf(x,y,z=50)
但我相信必须有一个更好的解决方案来控制可选参数,我无法在curve_fit
中找到它。有干净的方法吗?
修改
例如,在下面的MWE中,出现的图是以下内容,表示curve_fit
实际上也在优化可选值z
。预期会出现这种情况吗?
from scipy.optimize import curve_fit
from matplotlib import pyplot as plt
def fitf(x,y,z=10):
return x*y+z
array1=range(10)
array2=[ fitf(el,5., z=2) for el in array1 ]
print array1
print array2
a=curve_fit(fitf, array1, array2)[0]
print a[0]
array3=[ fitf(el, a[0], z=a[1]) for el in array1 ]
print array3
plt.plot(array1)
plt.plot(array2)
plt.plot(array3, 'o')
plt.show()
答案 0 :(得分:0)
您可以使用<template is="dom-repeat" items="{{data}}">
<div>
<span>{{index}}</span> <span>{{item}}</span>
</div>
</template>
或关闭来执行此操作。这是一个lambda:
lambda
闭包看起来像:
import numpy as np
from scipy.optimize import curve_fit
def func(x, a, b, c=10):
return a * np.exp(-b * x) + c
xdata = np.linspace(0, 4, 50)
y = func(xdata, 2.5, 1.3, 0.5)
ydata = y + 0.2 * np.random.normal(size=len(xdata))
popt, pcov = curve_fit(lambda x, a, b:func(x, a,b,c=1.), xdata, ydata)
这需要一些额外的行来定义闭包,但是对def F(c0):
def f(x, a, b):
return a * np.exp(-b * x) + c0
# return func(x, a, b, c0) # or use this, depending on what organizes your code best, etc (and I guess this might be a bit slower with the extra fcn call)
return f
popt, pcov = curve_fit(F(1.), xdata, ydata)
的调用更清晰,更直观。
正如@TomCho partial
所指出的那样,“显然这是因为partial functions cannot be inspected ...”
答案 1 :(得分:0)
您可以尝试使用全局变量z并具有设置它的功能。类似的东西:
z=10 # defining initial value for z
def fitf(x,y):
return x*y+z
设置全局变量z的函数:
def set_z(opt):
global z
z=opt
然后,您可以在使用curve_fit之前将z设置为不同的数字:)