Введение в логистическую регрессию

С точки зрения статистики

С точки зрения исследования операций

С точки зрения нейронной сети

Градиентный спуск

Метод Ньютона

Реализация логистической регрессии с нуля

Создать набор данных X и Y

import numpy as np
X = np.matrix(np.ones(2484)).T
X = np.append(X,np.matrix([0]*1379+[2]*638+[4]*213+[5]*254).T,axis=1)
Y = np.matrix([1]*24+[0]*1355+[1]*35+[0]*603+[1]*21+[0]*192+[1]*30+[0]*224).T

Определите f (β), ∇f (β) и ∇²f (β).

def f(beta):
  return np.ravel(np.ones(len(Y))*(np.log(1+np.exp(X*beta)))-Y.T*X*beta)[0]
def nabla_f(beta):
  return X.T*(1/(1+1/np.exp(X*beta))-Y)
def nabla2_f(beta):
  return X.T*(np.diag(np.ravel(np.exp(X*beta)/np.power(1+np.exp(X*beta),2)))*X)

Реализовать алгоритм градиентного спуска (λ = 0,001)

beta = np.matrix(np.zeros(X.shape[1])).T
TOL = np.power(10.,-10)
lam = 0.001
counter = 0
while np.linalg.norm(nabla_f(beta)) > TOL:
  counter += 1
  beta -= -lam*nabla_f(beta)
    
print('iter =',counter)
print(beta)
print('norm =',np.linalg.norm(nabla_f(beta)))

Внедрить алгоритм метода Ньютона

beta = np.matrix(np.zeros(X.shape[1])).T
TOL = np.power(10.,-10)
counter = 0
while np.linalg.norm(nabla_f(beta)) > TOL:
  counter += 1
  beta -= np.linalg.inv(nabla2_f(beta))*nabla_f(beta)
  
print('iter =',counter)
print(beta)
print('norm =',np.linalg.norm(nabla_f(beta)))

Проверить коэффициенты из

sklearn.linear_model.LogisticRegression

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(solver='lbfgs',C=1e9,fit_intercept=False).fit(X,np.ravel(Y))
np.set_printoptions(suppress=True)
print(clf.coef_)

Вывод

Приложение

Интуиция градиентного спуска

Интуиция в методе Ньютона

Компактное обозначение f (β), ∇f (β) и ∇²f (β)