Введение в логистическую регрессию
С точки зрения статистики
С точки зрения исследования операций
С точки зрения нейронной сети
Градиентный спуск
Метод Ньютона
Реализация логистической регрессии с нуля
Создать набор данных 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_)