如何在python

时间:2015-06-16 19:39:10

标签: python curve-fitting

我想使用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。预期会出现这种情况吗?

enter image description here

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()

2 个答案:

答案 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设置为不同的数字:)