Ошибка типа: объект ‘function’ не является итеративным python

#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. Я думаю, что я вас понял, но выразил это плохо, я только что отредактировал свой ответ.