Въведение в логистичната регресия

От гледна точка на статистиката

От гледна точка на изследването на операциите

От гледна точка на невронната мрежа

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

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

Внедряване на логистична регресия от нулата

Генерирайте набор от данни 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(β)