Когда я вызываю функцию train с моими данными, она выдает мне следующую ошибку:
ValueError: shape (2,100) и (2,1) не выровнены: 100 (dim 1)! = 2 (dim 0)
Одна вещь, которую вы должны помнить как программист, это то, что сообщения об ошибках неоценимы для отладки. Они дают вам ценную информацию о том, где ваша логика или код подвержен сбоям или уже не работает. Если вы прочитаете сообщение об ошибке, вы можете заметить следующее:
- . В качестве ошибки упоминается смещенные фигуры , и мы знаем, что фигуры связаны с векторами и матрицами , проблема, похоже, связана с размерами матрицы признаков и матрицы весов, передаваемых в вашу функцию логистической регрессии.
- В сообщении об ошибке упоминается смещение, которое указывает на проблему, возможно, с умножением матрицы , посколькуОжидается, что неправильно выровненные матрицы приведут к этой ошибке, если размеры матриц несовместимы для умножения или порядок, в котором они умножаются, делает операцию невозможной.
К настоящему времени вы, вероятно, поняли бы,что ошибка указывает на произведение Numpy dot матрицы элементов X и вектора весовых коэффициентов θ .
. Чтобы исправить эту ошибку, необходимо убедиться в двух вещах: формы матриц совместимы для проведения матрицумножение, и порядок умножения правильный. Помните, что в логистической регрессии вам нужен один скалярный выход для каждого наблюдения в матрице объектов, который затем может быть передан в качестве аргумента в функцию отображения вероятности наподобие функции sigmoid
, чтобы дать вам вероятность того, что определенный экземпляр принадлежит данному классу.
Решение ошибки
Чтобы решить эту проблему, транспонируйте матрицу объектов X , чтобы ее форма изменилась на(100,2). После выполнения транспонирования матрицы объектов, точечное произведение должно стать выполнимым, и, следовательно, решить возникающую ошибку.
Рекомендуется создать отдельную матрицу объектов, матрицу X , котораясодержит только столбцы объектов, а не целевой столбец, который является последним столбцом в ваших данных. Также рекомендуется создать вектор меток y , в котором будут храниться только метки или столбец целевого класса. Если бы я делал это, я бы делал все в Pandas, но так как вы работаете с Numpy, вот как вы можете это сделать.
X = np.transpose([(data['First Exam Score'], data['Second Exam Score']]) #Reshapes the feature matrix from (2,100) to (100,2)
y = data['Admitted']
train(X, y, weights, 0.00001, 1000)
Как вы можете заметить, код становится более читабельным, таким образом и шансывстречных ошибок уменьшается. Надеюсь, это поможет.