TypeError: не могу понять - PullRequest
       22

TypeError: не могу понять

0 голосов
/ 02 октября 2019

Я подгоняю очень простую кривую с тремя точками. с методом leastsq, следуя всем правилам. Но все же я получаю ошибку. Я не понимаю. Может кто-нибудь помочь. Большое спасибо

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsq

x = np.array([2.0,30.2,15.0])
y = np.array([45.0,56.2,30.0])

print(x)
print(y)

# model
def t(x,a,b,c):
    return a*x**2 + b*x + c

#residual fucntion
def residual_t(x,y,a,b,c):
    return y-t(x,a,b,c)


#initial parameters
g0 = np.array([0.0,0.0,0.0])

#leastsq method
coeffs, cov = leastsq(residual_t, g0, args=(x,y))
plt.plot(x,t(x,*coeffs),'r')
plt.plot(x,y,'b')
plt.show()

#finding out Rsquared and Radj squared value
absError = residual_t(y,x,*coeffs)
se = np.square(absError) # squared errors
Rsquared = 1.0 - (np.var(absError) / np.var(y))
n = len(x)
k = len(coeffs)
Radj_sq = (1-((1-Rsquared)/(n-1)))/(n-k-1)
print (f'Rsquared value: {Rsquared}   adjusted R saquared value: {Radj_sq}')

TypeError: residual_t () отсутствует 2 обязательных позиционных аргумента: 'b' и 'c'

Почему ?? coeffs - это уже массив, содержащий наилучшие значения a, b, c. coeffs также показывает undefined, а residual_t также показывает проблему. Не могли бы вы помочь мне понять.

1 Ответ

1 голос
/ 02 октября 2019

С копированием-вставкой вашего кода (включая изменение *coeffs) я получаю

1135:~/mypy$ python3 stack58206395.py 
[ 2.  30.2 15. ]
[45.  56.2 30. ]
Traceback (most recent call last):
  File "stack58206395.py", line 24, in <module>
    coeffs, cov = leastsq(residual_t, g0, args=(x,y))
  File "/usr/local/lib/python3.6/dist-packages/scipy/optimize/minpack.py", line 383, in leastsq
    shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
  File "/usr/local/lib/python3.6/dist-packages/scipy/optimize/minpack.py", line 26, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
TypeError: residual_t() missing 2 required positional arguments: 'b' and 'c'

То есть ошибка при использовании residual_t в leastsqcall.

Если я добавлю

residual_t(g0, x, y)

сразу после определения g0, я получу ту же ошибку:

1136:~/mypy$ python3 stack58206395.py 
[ 2.  30.2 15. ]
[45.  56.2 30. ]
Traceback (most recent call last):
  File "stack58206395.py", line 23, in <module>
    residual_t(g0, x, y)
TypeError: residual_t() missing 2 required positional arguments: 'b' and 'c'

Так что вам нужно определить residual_tработать с таким звонком. Я не собираюсь делать предположения о том, что вы действительно хотите, поэтому я оставлю исправление на ваше усмотрение.

Просто помните, что residual_t будет вызываться с x0, соединенным скортеж args. Это типичное использование для scipy.optimize функций. При необходимости просмотрите документы.

edit

Определение функции следующим образом:

def residual_t(abc, x, y):
    a,b,c = abc
    return y-t(x,a,b,c)

выполняется без ошибок.

...