2016-03-01 106 views
0

我想在代码中使用PyQt-Fit库,但遇到了麻烦。只是为了试验,我从包装主页复制了示例代码。pyqt_fit.CurveFitting示例抛出错误

这里是我运行代码:

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给出了同样的错误。

我试着用谷歌搜索我的问题,但我找不到一个工作的例子。

我需要更改以正确传递所有参数?

回答

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 

可以看出,它现在预计,除了外部数据和YDATA一切都被命名为参数,而先前p0fct未命名。 [这是明显地从文档中缺少]

例子中的函数调用真的应该是这样的:

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

自我回答,因为它是一个真正的问题,我花了一段时间试图解决,并希望把该解决方案在那里。 – Scimonster