scipy optimize не работает там, где работает тот же код в Matlab - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь реализовать логистическую регрессию в 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.

...