Понимание np.where () в контексте регрессии Logisti c - PullRequest
2 голосов
/ 30 апреля 2020

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

Пожалуйста, дайте мне знать, правильно ли я понимаю функцию np.where (), поскольку я прокомментировал это в коде под заголовком «АЛЬТЕРНАТИВНЫЕ КОММЕНТАРИИ РЕШЕНИЯ». Кроме того, было бы очень полезно, если бы моё понимание в разделе «КОММЕНТАРИИ АКТУАЛЬНОГО РЕШЕНИЯ» также могло быть проверено.

Альтернативное решение, использующее np.where (), также работает, когда я пытаюсь увеличить количество примеров. / вводит в X текущую сумму (m = 3), 4, 5 и т. д.

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

def predict(w, b, X):
    '''
    Predict whether the label is 0 or 1 using learned logistic regression parameters (w, b)

    Arguments:
    w -- weights, a numpy array of size (num_px * num_px * 3, 1)
    b -- bias, a scalar
    X -- data of size (num_px * num_px * 3, number of examples)

    Returns:
    Y_prediction -- a numpy array (vector) containing all predictions (0/1) for the examples in X
    '''

    m = X.shape[1]
    Y_prediction = np.zeros((1,m))    # Initialize Y_prediction as an array of zeros 
    w = w.reshape(X.shape[0], 1)

    # Compute vector "A" predicting the probabilities of a cat being present in the picture
    ### START CODE HERE ### (≈ 1 line of code)
    A = sigmoid(np.dot(w.T, X) + b)   # Note: The shape of A will always be a (1,m) row vector
    ### END CODE HERE ###

    for i in range(A.shape[1]):       # for i in range(# of examples in A = # of examples in our set)

        # Convert probabilities A[0,i] to actual predictions p[0,i]
        ### START CODE HERE ### (≈ 4 lines of code)
        Y_prediction[0, i] = 1 if A[0, i] > 0.5 else 0

        ''' 
        ACTUAL SOLUTION COMMENTS: 

        The above reads as:

        Change/update the i-th value of Y_prediction to 1 if the corresponding i-th value in A is > 0.5. 
        Otherwise, change/update the i-th value of Y_prediction to 0. 

        '''


        ''' 
        ALTERNATIVE SOLUTION COMMENTS:

        To condense this code, you could delete the for loop and Y_prediction var from the top, 
        and then use the following one line: 

        return np.where(A > 0.5, np.ones((1,m)), np.zeros((1,m))) 

        This reads as: 
        Given the condition > 0.5, return np.ones((1,m)) if True, 
        or return np.zeros((1,m)) if False. 

        Another way to understand this is as follows:
        Tell me where in the array A, entries satisfies the condition A > 0.5,
        At those positions, give me np.ones((1,m)), otherwise, give me 
        np.zeros((1,m))

        '''
        ### END CODE HERE ###

    assert(Y_prediction.shape == (1, m))

    return Y_prediction

w = np.array([[0.1124579],[0.23106775]])
b = -0.3
X = np.array([[1.,-1.1,-3.2],[1.2,2.,0.1]])
print(sigmoid(np.dot(w.T, X) + b))
print ("predictions = " + str(predict(w, b, X)))   # Output gives 1,1,0 as expected

1 Ответ

1 голос
/ 30 апреля 2020

Ваш альтернативный подход кажется нормальным. В качестве замечания добавлю, что вам даже не нужны np.ones и np.zeros, вы можете просто указать целые числа 0 и 1. При использовании np.where, если X и y (значения для замены в соответствии с условием) и одно и то же условие могут быть переданы, оно должно работать нормально. Вот простой пример:

y_pred = np.random.rand(1,6).round(2)
# array([[0.53, 0.54, 0.68, 0.34, 0.53, 0.46]])
np.where(y_pred> 0.5, np.ones((1,6)), np.zeros((1,6)))
# array([[1., 1., 1., 0., 1., 0.]])

И использование целых чисел:

np.where(y_pred> 0.5,1,0)
# array([[1, 1, 1, 0, 1, 0]])

Согласно вашим комментариям о том, как работает функция, она действительно работает так, как вы ее описали. Возможно, вместо To condense this code я бы сказал, что использование numpy делает его более эффективным, а в этом случае также понятным.

...