#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))) )