#python #typeerror
#python #ошибка типа
Вопрос:
for i in range(0,10):
res_lsq = np.sqrt(np.mean((polynomial_fit(lambda i: 'theta' str(i), xtr) - ytr)**2))
rmse.append(res_lsq)
Я нахожу среднеквадратичную ошибку для каждого полинома M-й степени, подходящего для кривой, используя метод наименьших квадратов. Я хочу изменить параметры веса, т.е. theta от theta0 до theta9 (значения с плавающей запятой) в моей функции polynomial_fit, чтобы добавить RMSE для каждого многочлена m-й степени в список rmse. Но он показывает ошибку следующим образом
TypeError Traceback (most recent call last)
<ipython-input-43-4e717fdd943a> in <module>
1 for i in range(0,10):
----> 2 res_lsq = np.sqrt(np.mean((polynomial_fit(lambda i: 'theta' str(i), xtr) - ytr)**2))
3 rmse.append(res_lsq)
<ipython-input-20-d7d3539688a0> in polynomial_fit(theta, x)
1 def polynomial_fit(theta, x):
2 """Polynomial model of degree (len(theta) - 1)"""
----> 3 return sum(t * x ** n for (n, t) in enumerate(theta))
TypeError: 'function' object is not iterable
Комментарии:
1. Вы передаете лямбда-функцию
polynomial_fit
, которая принимает итерацию в качестве своего первого аргумента.2. Похоже
theta
, что ожидается, что это также будет список числовых типов — вы пытаетесь передать строку.3. theta — это значения с плавающей запятой
4. Если вы замените
lambda i: 'theta' str(i)
его своим списком с плавающей запятой, это, по крайней мере, не выдаст ошибку.
Ответ №1:
На самом деле, в вашем коде есть разные ошибки:
np.mean
ожидает массив (итерируемый) в качестве первого аргумента. Но вы передаете функцию polynomial_fit
, которая возвращает сумму. он не выдаст никакой ошибки, чтобы передать int или значение с плавающей np.mean
точкой, но от этого мало пользы. В общем случае вы хотите, например, получить среднее значение [1,2,3,4] (== 2,5), а не «4».
Функция polynomial_fit
содержит enumerate(theta)
, но theta
НЕ является итеративной, поэтому вы получаете ошибку типа TypeError: 'function' object is not iterable
.
И это связано с содержимым лямбда-функции, оператор которой записывается в виде строки, как сказал @erip.
Комментарии:
1. Извините, но этот анализ неверен.
polynomial_fit
это вызов, вызывающий ошибку.2. Ах, я думаю, что выразился плохо (не совсем свободно владеет английским), я исправлю свой ответ, чтобы быть более понятным. Спасибо, что указали на это.
3. Ваш английский в порядке, но ваш диагноз — нет. Если вы удалите вызов
np.mean
, OP все равно будет наблюдать ошибку.4. Я думаю, что я вас понял, но выразил это плохо, я только что отредактировал свой ответ.