Python lmfit:模型对象尝试使用 "self" 作为自由变量
Python lmfit: Model object trys to use "self" as free variable
我正在使用 Python 模块 "lmfit" 将函数拟合到某些数据。变量应该有约束,我想将拟合程序实施到现有框架中。这就是为什么 fit 函数必须是 class 方法。因此函数的第一个参数应该是 "self".
import lmfit
class foo(object):
def __init__(self):
self.x_data = range(10)
self.y_data = range(10) + 2
def fit_func(self, x, a, b):
return a * x + b
def fit_with_lmfit(self):
model = lmfit.Model(self.fit_func, independent_vars=["x"])
model.set_param_hint("a", 1)
model.set_param_hint("b", 2)
results = model.fit(self.y_data, x=self.x_data)
return results
但现在 lmfit 将 "self" 解释为拟合算法的自由变量。
我尝试添加参数提示:
model.set_param_hint("self", self, vary=False)
但这会导致以下错误:
TypeError: fit_func() got multiple values for keyword argument 'self'
我知道 scipy.optimize 中的 curve_fit()
使用 class 方法没有任何问题,leastsq()
也不应该。但我想使用 lmfit,因为它提供了一个很好的接口来实现对某些变量的约束。
On 也可以在 fit_with_lmfit()
内部定义 fit_function()
但我也需要从 class 外部访问它并且返回 results
旁边的函数看起来很乱.
所以我的问题是:有什么方法可以让 lmfit 忽略拟合函数的某些变量,或者更好的是忽略 "self" 作为位置参数?
因为 fit_func
没有使用 self,所以让它成为一个静态方法:
@staticmethod
def fit_func(x, a, b):
return a * x + b
这样你就不用担心 self
.
我正在使用 Python 模块 "lmfit" 将函数拟合到某些数据。变量应该有约束,我想将拟合程序实施到现有框架中。这就是为什么 fit 函数必须是 class 方法。因此函数的第一个参数应该是 "self".
import lmfit
class foo(object):
def __init__(self):
self.x_data = range(10)
self.y_data = range(10) + 2
def fit_func(self, x, a, b):
return a * x + b
def fit_with_lmfit(self):
model = lmfit.Model(self.fit_func, independent_vars=["x"])
model.set_param_hint("a", 1)
model.set_param_hint("b", 2)
results = model.fit(self.y_data, x=self.x_data)
return results
但现在 lmfit 将 "self" 解释为拟合算法的自由变量。 我尝试添加参数提示:
model.set_param_hint("self", self, vary=False)
但这会导致以下错误:
TypeError: fit_func() got multiple values for keyword argument 'self'
我知道 scipy.optimize 中的 curve_fit()
使用 class 方法没有任何问题,leastsq()
也不应该。但我想使用 lmfit,因为它提供了一个很好的接口来实现对某些变量的约束。
On 也可以在 fit_with_lmfit()
内部定义 fit_function()
但我也需要从 class 外部访问它并且返回 results
旁边的函数看起来很乱.
所以我的问题是:有什么方法可以让 lmfit 忽略拟合函数的某些变量,或者更好的是忽略 "self" 作为位置参数?
因为 fit_func
没有使用 self,所以让它成为一个静态方法:
@staticmethod
def fit_func(x, a, b):
return a * x + b
这样你就不用担心 self
.