Я пытаюсь реализовать логистическую регрессию в Python без sckitlearn, мой код выглядит нормально, но ни один из алгоритмов оптимизации не может найти оптимальное значение для параметра (коэффициентов)
Я также пробовал с и без передачиметод градиента в оптимизации.значение, которое он возвращает, равно nan, тогда как те же данные и тот же код работают нормально в octave / matlab.
Я перепробовал почти все алгоритмы в scipy.optimize и минимизировал 'Nelder-Mead' (см. здесь)
«Пауэлл» (см. Здесь)
«КГ» (см. Здесь)
«БФГС» (см. Здесь)
«Ньютон-КГ» (см. здесь)
'L-BFGS-B' (см. здесь)
'TNC' (см. здесь)
def costfunction(theta,X,y):
m=len(y)
j = (-1/m)*np.sum( y * log(sigmoid(np.dot(X,theta))) + (1-y)*log(1-sigmoid(np.dot(X,theta))))
return j
def gradient(theta,X,y):
hypo = sigmoid(np.dot(X,theta))
grad = np.dot(np.transpose(X),(hypo - y))
return grad
def learn_lostisticreg(X,y):
theta = np.random.rand(X.shape[1])
from scipy import optimize as opt
return opt.fmin_cg(f=costfunction,x0=theta,args=(X,y))
def insert_ones(X):
X_bias = np.c_[np.ones(X.shape[0]),X]
return X_bias
X_bias = insert_ones(X)
theta=np.zeros(shape=(X_bias.shape[1],1))
print ("Initial Error : ",costfunction(theta,X_bias,y))
print("Learning theta optimum using scipy")
newtheta = learn_lostisticreg(X_bias,y)
print("Error after learning :",costfunction(newtheta,X_bias,y))
Вывод, который я получаю:
Начальная ошибка: 68.542789 Изучение оптимального тэта с использованием scipy Оптимизация успешно завершена.Текущее значение функции: nan Итерации: 0 Оценки функции: 31 Оценка градиента: 1
Ошибка после обучения: nan /opt/conda/lib/python3.6/site-packages/ipykernel_launcher.py:4: RuntimeWarning:недопустимое значение, встречающееся в true_divide после удаления cwd из sys.path.