Функция Python ведет себя по-другому, когда я вызываю ее в другом функциональном цикле

#python

#python

Вопрос:

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

 def costFunction(theta, X, y):
    
    m = y.size

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

    m = y.shape[0]
    J_history = []
    theta = theta.copy()

    for _ in range(num_itr):
        
        tempZero = theta[0]

        theta -= (alpha/m) * (np.dot(X.T , (sigmoid(np.dot(X,theta))-y)))
        theta[0] = tempZero -  ( (alpha/m) * np.sum((sigmoid(np.dot(X,theta))-y)))

        J_history.append(costFunction(theta, X, y))

    return theta , J_history

 

и когда я вызываю «функцию стоимости» отдельно, она работает так, как я ожидал:

 intial_theta = np.zeros(X.shape[1])

J = costFunction(intial_theta, X, y):

print(J) # works as expected
 

но когда я вызываю ее в функции gradiantDescent, вся J_history будет иметь значение ‘nan’:

 theta , Jvec = gradiantDescent(0.05, intial_theta , X , y , 500)

print(Jvec) #all values are 'nan'

 

Итак, как я могу это исправить.

Комментарии:

1. когда вы вызываете gradiantDescent , вы вызываете costFunction перед этим?

2. Нет, сначала я вызываю gradiantDescent, и он работает не так, как я ожидал, поэтому я вызываю функцию стоимости отдельно, чтобы проверить, работает ли она и работает ли она правильно, как показано ранее. @illusion

3. В вашем коде обновляется только theta[0] . Разве он не должен выполняться для всех тетов в массиве тета?

4. Или, скорее, вы обновляете только один вес. Разве вы не должны обновлять их все?

5. Она уже запущена для всех thetas. поскольку RHS в (theta = …) представляет собой массив с формой (5,), поэтому массив theta обновляется на каждой итерации, и я обновляю theta[0] отдельно, потому что он должен принимать другое значение, а не как другие индексы

Ответ №1:

Попробуйте это в своей gradiantDescent функции:

 for _ in range(num_itr):
    theta = theta - (alpha / m) * np.dot(X.T, (np.dot(X, theta) - y))
    J_history.append(costFunction(theta, X, y))
return theta, J_history
 

Вы получаете nan значение, потому что некоторые вычисления идут неправильно…

Комментарии:

1. вы правы, значения тета идут не так, вы предупредили меня об этом, я попытался найти ошибку, и это был минус-операнд ‘-‘. Я изменил ее на numpy.subtract(), и она работает правильно, спасибо за ваши усилия.

Ответ №2:

Минус-операнд был ошибкой при вычислении теты, следует использовать numpy.subtract(arr1, arr2) Старый код:

 theta -= (alpha/m) * (np.dot(X.T , (sigmoid(np.dot(X,theta))-y)))
 

Новое:

 np.subtract( theta ,(alpha/m) * (np.dot(X.T , (sigmoid(np.dot(X,theta))-y))) )