2016-03-01 2 views
0

Я пытаюсь использовать библиотеку PyQt-Fit в своем коде, но у меня проблемы. Для экспериментов я скопировал код примера с домашней страницы пакета.pyqt_fit.CurveFitting пример throwing error

Вот код я бегу:

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 

Как можно видеть, что теперь ожидает, все для 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() 
+0

Self-ответил, потому что это была реальная проблема, что я провел некоторое время, пытаясь решить, и хотел поставить решение там. – Scimonster