ValueError. Линейная регрессия и нахождение среднеквадратичной ошибки на питоне
В задаче требуется найти среднеквадратичное отклонение для заданного набора данных. X - хранит в себе признаки, y - ожидаемые ответы. По сути это имитация обучения нейросети с учителем. Массив с признаками стандартизируется, к нему для учёта смещения добавляется вектор-столбец единиц слева, потом находятся веса по формуле, которую можно понять из кода и после этого требуется определить собственно само предсказание, то есть скалярное произведение вектора весов w на вектор признаков X. Здесь и возникает ошибка: ValueError: shapes (9,1) and (10,9) not aligned: 1 (dim 1) != 10 (dim 0). Понимаю, что что-то не так с размерностями, но найти конкретное место не могу.
import numpy as np
X = np.array([[ 8.32520000e+00, 4.10000000e+01, 6.98412698e+00,1.02380952e+00, 3.22000000e+02, 2.55555556e+00,3.78800000e+01, -1.22230000e+02],
[ 8.30140000e+00, 2.10000000e+01, 6.23813708e+00,9.71880492e-01, 2.40100000e+03, 2.10984183e+00,3.78600000e+01, -1.22220000e+02],
[ 7.25740000e+00, 5.20000000e+01, 8.28813559e+00,1.07344633e+00, 4.96000000e+02, 2.80225989e+00,3.78500000e+01, -1.22240000e+02],
[ 5.64310000e+00, 5.20000000e+01, 5.81735160e+00,1.07305936e+00, 5.58000000e+02, 2.54794521e+00,3.78500000e+01, -1.22250000e+02],
[ 3.84620000e+00, 5.20000000e+01, 6.28185328e+00,1.08108108e+00, 5.65000000e+02, 2.18146718e+00,3.78500000e+01, -1.22250000e+02],
[ 4.03680000e+00, 5.20000000e+01, 4.76165803e+00,1.10362694e+00, 4.13000000e+02, 2.13989637e+00,3.78500000e+01, -1.22250000e+02],
[ 3.65910000e+00, 5.20000000e+01, 4.93190661e+00,9.51361868e-01, 1.09400000e+03, 2.12840467e+00,3.78400000e+01, -1.22250000e+02],
[ 3.12000000e+00, 5.20000000e+01, 4.79752705e+00,1.06182380e+00, 1.15700000e+03, 1.78825348e+00,3.78400000e+01, -1.22250000e+02],
[ 2.08040000e+00, 4.20000000e+01, 4.29411765e+00,1.11764706e+00, 1.20600000e+03, 2.02689076e+00,3.78400000e+01, -1.22260000e+02],
[ 3.69120000e+00, 5.20000000e+01, 4.97058824e+00,9.90196078e-01, 1.55100000e+03, 2.17226891e+00,3.78400000e+01, -1.22250000e+02]])
# тут объявлено первые 10 ответов для первых 10 признаковых описаний
y = np.array([4.526, 3.585, 3.521, 3.413, 3.422, 2.697, 2.992, 2.414, 2.267, 2.611])
# стандартизация
X =(X-np.mean(X,axis=0))/X.std(axis=0)
# добавление единиц слева для смещения
ones=np.ones(10)
ones=ones[:, np.newaxis]
X = np.c_[ones, X]
# веса
w=np.dot(np.dot(np.linalg.inv(np.dot(X.T,X)),X.T),y)
# в строке ниже преобразовала вектор-строку w в вектор-столбец, в надежде, что это поможет исправить ошибку
w=w[:, np.newaxis]
# прогнозы
#ошибка в следующей строке
preds = np.dot(w,X)
# среднеквадратичная ошибка
error = (1/len(y))*(y-preds)**2
print(round(error, 5))
Ответы (2 шт):
Умножать нужно видимо в другом порядке, поменять элементы местами:
# preds = np.dot(w,X)
preds = np.dot(X,w)
Для умножения матриц соседние размерности (в середине) должны совпадать
(9,1) * (10,9) - середина не совпадает
(10,9) * (9,1) - совпадает, 9 = 9
И ещё квадраты разностей нужно суммировать:
error = (1/len(y))*((y-preds)**2).sum()
^^^^^^
Уже разобралась. Ответ 0.00982. Решение в таком виде приняли.
# прогнозы
preds = np.dot(w,X.T)
# среднеквадратичная ошибка
error = (1/len(y))*sum((y-preds)**2)
print(round(error, 5))