Две разные стоимости в функции затрат логистической регрессии - PullRequest
0 голосов
/ 18 января 2019

Я реализую алгоритм логистической регрессии с двумя функциями x1 и x2. Я пишу код функции стоимости в логистической регрессии.

def computeCost(X,y,theta):
    J =((np.sum(-y*np.log(sigmoid(np.dot(X,theta)))-(1-y)*(np.log(1-sigmoid(np.dot(X,theta))))))/m)
    return J

Здесь My X - матрица обучающего набора, y - выход. форма X - (100,3), а форма y - (100,), как определено атрибутом shape библиотеки numpy. Моя тета изначально содержит все нулевые записи с формой (3,1). Когда я рассчитал стоимость с этими параметрами, я получил стоимость 69,314. Но это неверно. Правильная стоимость 0,69314. На самом деле, я получил эту правильную стоимость, когда я изменил свой вектор y на y = numpy.reshape(y,(-1,1)). Но я на самом деле не понял, как это изменение формы корректирует мои затраты. Здесь m (номера обучающего набора) равно 100.

1 Ответ

0 голосов
/ 19 января 2019

Прежде всего, никогда в будущем просто не создавайте свой код! Ваш пост (код + объяснение) должен быть настолько описательным, насколько это возможно! (не многословно, никто не будет читать это). Вот что делает ваш код! Пожалуйста, опубликуйте читаемый код в будущем! Иначе трудно читать и отвечать!

def computeCost(X,y,theta):
    '''
     Using Mean Absolute Error

     X:(100,3)
     y: (100,1)
     theta:(3,1)
     Returns 1D matrix of predictions
     Cost = ( log(predictions) + (1-labels)*log(1-predictions) ) / len(labels)
     '''
    m = len(y)
    # calculate the prediction
    predictions = sigmoid(np.dot(X,theta))

    # error for when label is of class1
    class1_cost= -y * np.log(predictions)
    # error for when label is of class1
    class2_cost= (1-y)*np.log(1-predictions)
    # total cost
    cost = class1_cost-class2_cost
    # averaging cost
    cost =cost.sum() / m
    return cost

Вы должны сначала понять, как точечный продукт работает в математике и какую форму ввода вы бы использовали в алгоритме, чтобы дать вам правильный ответ! Не бросайте случайные формы! Ваш feature_vector имеет форму (100,3), которая при умножении на вашу тета, какая из фигур (3,1), выведет вектор предсказания формы (100,1).

Matrix multiplication: The product of an M x N matrix and an N x K matrix is an M x K matrix. The new matrix takes the rows of the 1st and columns of the 2nd

Итак, ваше измерение у должно быть в форме (100,1), а не в (100,). Огромная разница! Одним из них является [[3], [4], [6], [7], [9], ...], а другим [3,4,6,7,9, .....]. Ваше измерение должно соответствовать для правильного вывода!

Лучший способ задать вопрос - как рассчитать ошибку / стоимость в логистической регрессии, используя правильные размеры моих меток.!

Для дополнительного понимания!

import numpy as np

label_type1= np.random.rand(100,1)
label_type2= np.random.rand(100,)
predictions= np.random.rand(100,1)
print(label_type1.shape, label_type2.shape, predictions.shape)

# When you mutiply (100,1) with (100,1) --> (100,1)
print((label_type1 * predictions).shape)

# When you do a dot product (100,1) with (100,1) --> Error, for which you have to take a transpose which isn't relavant to the context!
# print( np.dot(label_type1,predictions).shape) # error: shapes (100,1) and (100,1) not aligned: 1 (dim 1) != 100 (dim 0)
print( np.dot(label_type1.T,predictions).shape) # 
print('*'*5)

# When you mutiply (100,) with (100,1) --> (100,100) !
print((label_type2 * predictions).shape) # 

# When you  do a dot product (100,) with (100,1) --> (1,) !
print(np.dot(label_type2, predictions).shape) 
print('*'*5)

# what you are doin
label_type1_addDim = np.reshape(label_type2,(-1,1))
print(label_type1_transpose.shape)

Итак, если перейти прямо к делу, то, что вы хотите достичь, это стоимость с dim (100,1)! так что либо вы делаете 1-й, что вы не делаете! или вы делаете пятое, где вы неосознанно добавляете измерение к вашему сделав его из (100,) в (100,1) и выполнив ту же операцию *, что и в первом случае! чтобы получить тусклое (100,1).

...