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