ValueError: фигуры (20,1) и (2,1) не выровнены: 1 (тусклый 1)! = 2 (тусклый 0)

Я немного новичок в машинном обучении и пытаюсь выполнить линейную регрессию без использования linear_model.LinearRegression () через sklearn. Я думаю, что приближаюсь к концу моего кодирования и готовлюсь к построению линии, но получаю сообщение об ошибке «ValueError: формы (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-except вокруг этой строки кода:

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.]]

person Spigot    schedule 16.10.2018    source источник
comment
В идеале ваш пример должен выглядеть примерно так: Для этих X, theta и y следующий код: np.sum((X @ theta.T - y) * X, axis=0) дает эту ошибку: ...   -  person Georgy    schedule 16.10.2018
comment
Что касается вашего редактирования: мы по-прежнему не можем запустить ваш код и воспроизвести проблему, потому что вы не предоставили diabetes_data и diabetes. Но на самом деле они нам не нужны, так как вы все равно можете уменьшить свой пример. Вы можете использовать try-except, чтобы поймать момент, когда у вас появится ошибка и распечатайте значения X и y. Затем добавьте их сюда.   -  person Georgy    schedule 16.10.2018
comment
Вы должны были напечатать полные X и y, потому что вы используете в этой формуле полные массивы, а не отдельные их элементы. Но мы приближаемся!   -  person Georgy    schedule 16.10.2018
comment
Это тоже был мой первый инстинкт, черт возьми, у меня даже была вся информация и все остальное, прежде чем я просто дал X [i] и y [i].   -  person Spigot    schedule 16.10.2018
comment
Я подозреваю, что вы хотите X @ theta, а не X @ theta.T.   -  person Blckknght    schedule 16.10.2018
comment
@Blckknght Я так не думаю. Форма X и форма theta не равны ((20,) и (2,)). Точечный продукт не будет работать здесь. Вероятно, у них есть ошибка в формуле или в определении theta.   -  person Georgy    schedule 16.10.2018
comment
Сообщение об исключении предполагает, что они имеют форму (20, 1) и (1, 2) соответственно, которые могут правильно размножаться. Перемещение второго дает форму (2, 1), что вызывает исключение. Печатные значения подтверждают эти выводы (X выглядит длинным столбцом, а theta имеет два элемента в одной строке).   -  person Blckknght    schedule 16.10.2018
comment
Поэтому я удалил .T, чтобы проверить это, мне также пришлось удалить .T из этой строки кода: inner = np.power(((X @ theta.T) - y), 2), потому что это вызвало ту же ошибку. Программа теперь работает, но я получаю ровную линию за пределами точек данных.   -  person Spigot    schedule 16.10.2018


Ответы (1)


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

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

person Blckknght    schedule 16.10.2018
comment
Да, похоже, у меня может быть неправильная формула получения моей линейной регрессии. Удаление .T избавило меня от ошибки, с которой я столкнулся. Однако, к сожалению, похоже, что мне придется вернуться к началу, чтобы понять, как сделать нужную мне линию. - person Spigot; 16.10.2018