ValueError: формы (20,1) и (2,1) не выровнены: 1 (dim 1)! = 2 (dim 0) - PullRequest
0 голосов
/ 16 октября 2018

Я немного новичок в машинном обучении и пытаюсь выполнить линейную регрессию без использования linear_model.LinearRegression () через sklearn.Я думаю, что я близок к концу своего кодирования и готовлюсь к построению линии, но я получаю ошибку «ValueError: shape (20,1) и (2,1) не выровнены: 1 (dim 1)! = 2 (дим 0) ".Я распечатал свои матрицы 20 на 1, чтобы подтвердить, и ни у одного из них нет никаких дополнительных измерений или чего-либо еще, поэтому я не уверен, почему это дает мне (2,1) в сообщении об ошибке или почему измерения не совпадают.У кого-нибудь есть рекомендации по "выравниванию" этих матриц?Я использую Python 3.5.1.

Редактировать: Я рассмотрел множество других тем ValueError в stackoverflow, но у меня возникли проблемы с пониманием рекомендаций.Если это возможно, условия для мирян будут высоко оценены.

По Георгию Я сузил код до строк кода, необходимых для появления сообщения об ошибке.alpha, iters и theta были оставлены в покое, чтобы показать все переменные, необходимые для передачи в функции.

Редактировать 2: Хорошо, попытайтесь 2 уменьшитьпример кода.Спасибо за работу со мной над этим.Я поместил оператор try-exc вокруг этой строки кода:

theta = theta -(alpha/len(X)) * np.sum((X @ theta.T - y) * X, axis=0)

Указанная строка расположена в цикле for с использованием i в качестве переменной.Указанная строка дает мне следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\YungL\Desktop\linearRegression.py", line 30, in <module>
    slope_and_intercept, cost = gradDescent(X_test, Y_test, theta, alpha, iters)
  File "C:\Users\YungL\Desktop\linearRegression.py", line 26, in gradDescent
    theta = theta -(alpha/len(X)) * np.sum((X @ theta.T - y) * X, axis=0)
ValueError: shapes (20,1) and (2,1) not aligned: 1 (dim 1) != 2 (dim 0)

Печать X[i], y[i] и theta, когда выбрасывается исключение, дает мне это соответственно:

[[ 0.07786339]    [[233.]    [[1. 1.]]

Столбец 1 - X, столбец 2 - y, а столбец 3 - theta.Ссылаясь на матрицы, это первые значения в каждой матрице.Хотя для theta это единственное значение.

Вот полная матрица X и y на момент исключения:

[[ 0.07786339]    [[233.]
 [-0.03961813]    [ 91.]
 [ 0.01103904]    [111.]
 [-0.04069594]    [152.]
 [-0.03422907]    [120.]
 [ 0.00564998]    [ 67.]
 [ 0.08864151]    [310.]
 [-0.03315126]    [ 94.]
 [-0.05686312]    [183.]
 [-0.03099563]    [ 66.]
 [ 0.05522933]    [173.]
 [-0.06009656]    [ 72.]
 [ 0.00133873]    [ 49.]
 [-0.02345095]    [ 64.]
 [-0.07410811]    [ 48.]
 [ 0.01966154]    [178.]
 [-0.01590626]    [104.]
 [-0.01590626]    [132.]
 [ 0.03906215]    [220.]
 [-0.0730303 ]]   [ 57.]]

1 Ответ

0 голосов
/ 16 октября 2018

Для умножения матриц (что и делает оператор @), вам необходимо сопоставить внутренние размеры рассматриваемых матриц.То есть вы можете умножить матрицу 20 x 1 на матрицу 1 x 2, но не на матрицу 2 x 1.Это не numpy специфическая вещь, это просто базовый факт матричной арифметики.

Проблема, с которой вы столкнулись, заключается в том, что X @ theta.T в вашем коде приводит к несоответствующим измерениям.Я не знаю, что представляют эти переменные (и вы отредактировали вопрос, чтобы выяснить, откуда они берутся), но, учитывая ошибку, вы, вероятно, захотите вместо X @ theta.Это будет выполнять умножение 20 x 1 и 1 x 2, а не умножение 2 x 1, которое математически не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...