我尝试在代码中使用PyQt-Fit库,但遇到了麻烦。仅仅是为了试验,我从包主页复制了示例代码。
以下是我正在运行的代码:
import pyqt_fit
from pyqt_fit import plot_fit
import numpy as np
from matplotlib import pylab
x = np.arange(0,3,0.01)
y = 2*x + 4*x**2 + np.random.randn(*x.shape)
def fct(params, x):
(a0, a1, a2) = params
return a0 + a1*x + a2*x*x
fit = pyqt_fit.CurveFitting(x, y, (0,1,0), fct)
result = plot_fit.fit_evaluation(fit, x, y)
print(fit(x)) # Display the estimated values
plot_fit.plot1d(result)
pylab.show()
这是我得到的错误:
fit = pyqt_fit.CurveFitting(x, y, (0,1,0), fct)
TypeError: __init__() takes exactly 3 arguments (5 given)
Example code from the docs会出现同样的错误。
我试过谷歌搜索我的问题,但我找不到一个有效的例子。
我需要更改什么来正确传递所有参数?
答案 0 :(得分:3)
我能够通过查看PyQt-Fit 1.2源代码来解决这个问题,看看签名在版本1.2和1.3之间如何变化。旧CurveFitting.__init__()
看起来像这样:
def __init__(self, xdata, ydata, p0, fct, args=(), residuals=None,
fix_params=(), Dfun=None, Dres = None, col_deriv=1,
constraints = None, *lsq_args, **lsq_kword):
new one看起来像这样:
def __init__(self, xdata, ydata, **kwords):
self._fct = None
self._Dfun = None
self._residuals = None
# snip...
self.xdata = xdata
self.ydata = ydata
for n in kwords:
setattr(self, n, kwords[n])
# getters and setters for all the other properties
可以看出,它现在希望除了xdata和ydata之外的所有内容都是命名参数,而之前的p0
和fct
是未命名的。 [文档中明显遗漏了这一点。]
示例中的函数调用应该如下所示:
fit = pyqt_fit.CurveFitting(x, y, p0=(0,1,0), function=fct)
至少对我来说,它仍然会在下一行引发错误:
File "untitled0.py", line 18, in <module>
result = plot_fit.fit_evaluation(fit, x, y)
File "pyqt_fit/plot_fit.py", line 165, in fit_evaluation
popt = fit.popt
AttributeError: 'CurveFitting' object has no attribute 'popt'
在尝试绘制图形之前,似乎它希望我调用返回的fit()
函数。我只是将print(fit(x))
行的顺序改为这一行,这解决了它。
现在的工作代码是:
import pyqt_fit
from pyqt_fit import plot_fit
import numpy as np
from matplotlib import pylab
x = np.arange(0,3,0.01)
y = 2*x + 4*x**2 + np.random.randn(*x.shape)
def fct(params, x):
(a0, a1, a2) = params
return a0 + a1*x + a2*x*x
fit = pyqt_fit.CurveFitting(x, y, p0=(0,1,0), function=fct)
print(fit(x)) # Display the estimated values1
result = plot_fit.fit_evaluation(fit, x, y)
plot_fit.plot1d(result)
pylab.show()