ValueError: фигуры (2100) и (2,1) не выровнены: 100 (тусклый 1)! = 2 (тусклый 0) - PullRequest
0 голосов
/ 30 сентября 2019

Я делаю домашнее задание по машинному обучению и делаю градиент логистической регрессии и стоимость логистической регрессии. Мои функции таковы:

def calcLogRegressionCost(X, y, theta):
    #X is the feature vector
    #Y is the target vector/ output vector
    #theta is the weight vector 

    observations = len(y)
    predictions = sigmoid(np.dot(X, theta))

    #Take the error when label=1
    class1_cost = -y*np.log(predictions)

    #Take the error when label=0
    class2_cost = (1-y)*np.log(1-predictions)

    #Take the sum of both costs
    cost = class1_cost + class2_cost

    #Take the average cost
    cost = cost.sum() / observations

    return cost



def logRegressionGradientDescent(X, y, theta0, alpha):
    #X is the feature vector
    #Y is the target vector/ output vector
    #theta0 is the weight vector 
    #alpha is the learning rate
    #iteration is the steps you want to take 
    #Start you code from here\


    N = len(X)

    #1 - Get Predictions
    predictions = sigmoid(np.dot(X, theta0))

    #2 Transpose features from (100, 2) to (2, 100)
    # So we can multiply w the (100,1)  cost matrix.
    # Returns a (2,1) matrix holding 3 partial derivatives --
    # one for each feature -- representing the aggregate
    # slope of the cost function across all observations
    gradient = np.dot(X.T,  predictions - y)

    #3 Take the average cost derivative for each feature
    gradient /= N

    #4 - Multiply the gradient by our learning rate
    gradient *= lr

    #5 - Subtract from our weights to minimize cost
    weights -= gradient

    #you should return theta or loss or the both depending on your way
    #of implementation

    return weights

Они просят меня запустить алгоритм градиентного спуска, чтобы подогнать мои параметры тета к моему тренировочному набору. Я сделал функцию поезда, которая выглядит следующим образом:

W1 = 0.0
W2 = 0.0
weights = np.array([
    [W1],
    [W2]
])


def train(features, labels, weights, lr, iters):
    cost_history = []

    for i in range(iters):
        weights = logRegressionGradientDescent(features, labels, weights, lr)

        #Calculate error for auditing purposes
        cost = cost_function(features, labels, weights)
        cost_history.append(cost)

        # Log Progress
        if i % 1000 == 0:
            print ("iter: " +str(i) + " cost: "+str(cost))

    return weights, cost_history


train([data['First Exam Score'], data['Second Exam Score']], data['Admitted'], weights, 0.00001, 1000)

Когда я вызываю функцию train с моими данными, она выдает мне следующую ошибку:

ValueError: shape (2100) и (2,1) не выровнено: 100 (dim 1)! = 2 (dim 0)

Я не уверен, как привести параметры в соответствие с моим набором данных. Набор данных представляет собой кадр данных размером 100 x 3. Первые 2 столбца - это данные о 100 учениках, полученные в первом и втором экзаменах соответственно. Третий столбец показывает, поступили ли они в желаемый университет или нет, в зависимости от их оценок. Он представлен 0 или 1.

1 Ответ

1 голос
/ 01 октября 2019

Когда я вызываю функцию train с моими данными, она выдает мне следующую ошибку:

ValueError: shape (2,100) и (2,1) не выровнены: 100 (dim 1)! = 2 (dim 0)

Одна вещь, которую вы должны помнить как программист, это то, что сообщения об ошибках неоценимы для отладки. Они дают вам ценную информацию о том, где ваша логика или код подвержен сбоям или уже не работает. Если вы прочитаете сообщение об ошибке, вы можете заметить следующее:

  1. . В качестве ошибки упоминается смещенные фигуры , и мы знаем, что фигуры связаны с векторами и матрицами , проблема, похоже, связана с размерами матрицы признаков и матрицы весов, передаваемых в вашу функцию логистической регрессии.
  2. В сообщении об ошибке упоминается смещение, которое указывает на проблему, возможно, с умножением матрицы , посколькуОжидается, что неправильно выровненные матрицы приведут к этой ошибке, если размеры матриц несовместимы для умножения или порядок, в котором они умножаются, делает операцию невозможной.

К настоящему времени вы, вероятно, поняли бы,что ошибка указывает на произведение 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)

Как вы можете заметить, код становится более читабельным, таким образом и шансывстречных ошибок уменьшается. Надеюсь, это поможет.

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