#python
#python
Вопрос:
Здравствуйте, я устанавливаю код для rmse, но это ошибка
import numpy as np
import matplotlib.pyplot as plt
import random
data=[[235,591],[216,539],[148,413],[35,310],[85,308],[204,519],[49,325],[25,332],[173,498],[191,498],[134,392],[99,334],[117,385],[112,387],[162,425],[272,659],[159,400],[159,427],[59,319],[198,522]]
x_data=[x_row[0] for x_row in data]
y_data=[y_row[1] for y_row in data]
a=np.random.randint(0,10)
b=np.random.randint(0,100)
def f(x):
return b a*x
def E(x,y):
return 0.5*np.sum((y-f(x))**2)
n=1e-3
D=1
count=0
error=E(x_data,y_data)
while D>1e-2:
tmp0=b-n*np.sum((f(x_data)-y_data))
tmp1=a-n*np.sum((f(x_data)-y_data)*x_data)
b=tmp0
a=tmp1
current_error=E(x_data,y_data)
D=error-current_error
count=count 1
if count % 100 == 0 :
print(count,a,b,current_error,D)
ошибка
Traceback (most recent call last):
return b a*x
TypeError: unsupported operand type(s) for : 'int' and 'list'
Комментарии:
1.
x
является alist
, вы не можете использовать его в вычислении сint
s — что вы пытаетесь с ним сделать?2. Вы пытаетесь умножить и суммировать список и целое число … Вы не можете умножать списки… Итак, можете ли вы объяснить, что вы пытаетесь сделать?
Ответ №1:
Проблема заключается в
def f(x):
return b a*x
В этом контексте a
и b
интерпретируются как целые числа, в то время x
как интерпретируются как список.
Если вы намерены применить вычисление к каждому элементу x
, попробуйте что-то вроде этого:
def f(x):
out = []
for i in x:
out.append(b a*i)
return out
У вас будут аналогичные ошибки при попытке выполнить дополнительные вычисления позже, когда вы используете списки в вычислениях. Вам придется внести аналогичные изменения.
Например:
def E(x,y):
return 0.5*np.sum((y-f(x))**2)
Необходимо будет изменить на что-то вроде:
def E(x,y):
out = []
for xi, yi in zip(y, f(x)):
out.append(0.5*np.sum((yi-xi**2)))
return out
Чтобы избежать TypeError: unsupported operand type(s) for -: 'list' and 'list'