前言
逻辑回归也被称为对数机率回归,注意这里面说的回归并不是真正意义上的回归算法,其实它是一个经典的分类算法,至于为什么会有“回归”命名,后面会讲到。
逻辑回归(Logistic Regression)
1、Sigmoid函数
说逻辑回归算法之前必须整明白Sigmoid函数!!
Sigmoid函数表达式:
g(z)=1+e−z1(1)
其函数图像如下:
其自变量取值为任意实数,值域为[0,1],将任意的输入映射到了[0,1]区间,如果在线性回归中得到一个预测值,再将该值映射到Sigmoid函数中,这样就完成了由值到概率的转换,也就是分类任务。逻辑回归计算法就是这个思想。
2、算法推导
首先表示一些变量
令X={x1,x2,...,xn}表示n个样本
令W={w1,w2,...,wn}表示每个样本对应的系数
令B={b1,b2,...,bn}表示偏置项
令Y={Y1,Y2,...,YN}表示线性回归算法得到的回归值
那么,由线性回归算法可知每个样本对应的回归值:
Y=⎝⎜⎜⎛Y1Y2...Yn⎠⎟⎟⎞=(w1,w2,...,wn)⎝⎜⎜⎛x1x2...xn⎠⎟⎟⎞+⎝⎜⎜⎛b1b2...bn⎠⎟⎟⎞=WTX+B(2)
化简下(2)式:
令θ=(W;B),X=(X;1),那么
Y=θTX(3)
如上面红色字体所述,将线性回归算法得到的回归值(3)带入到Sigmoid函数(1)(令z = Y)中:
hθ(X)=g(Y)=g(θTX)=1+e−θTX1(4)
此处就该说明为什么该算法针对分类问题,但是还叫他"回归":
x现在简单表达下式(4),线性回归z=wTx+b,带入逻辑回归y=1+e−z1中,得:
y=1+e−(wTx+b)1(这里记为式a)
再简单变换下:
ln1−yy=wTx+b
若将y视为样本x作为正例的可能性,则1-y是其反例可能性,两者的比值1−yy称为机率,对机率取对数则得到对数机率ln1−yy,这样的话,式a实际上是在用线性回归模型的去逼近真实标记的对数机率,因此被称为“对数机率回归”。
令y表示分类任务的分类标签,那么有:
P(y=1∣X;θ)=hθ(X)(5)
P(y=0∣X;θ)=1−hθ(X)(6)
将(5)和(6)合起来,可以写成如下形式:
P(y∣X;θ)=(hθ(X))y(1−hθ(X))1−y(7)
为了求出最优参数θ,下面就开始了极大似然估计的套路了(关于极大似然估计参见本人的另一篇博文)
似然函数:L(θ)=i=1∏nP(yi∣xi;θ)=i=1∏n(hθ(xi))y(1−hθ(xi))1−y(8)
上式取对数:
l(θ)=lnL(θ)=i=1∑n[yilnhθ(xi)+(1−yiln(1−hθ(xi)))](9)
取式(9)的极大值,这里将问题转换成求其极小值,即:
θargmaxl(θ)=θargmin−n1J(θ)=−n1i=1∑n[yilnhθ(xi)+(1−yi)ln(1−hθ(xi))](10)
式(10)就是逻辑回归的损失函数
对式(10)关于θ求导
∂θj∂J(θ)=−n1i=1∑n[hθ(xi)yi∂θj∂(hθ(xi))−1−hθ(xi)1−yi∂θj∂(hθ(xi))]=−n1i=1∑n[g(θTxi)yi−1−g(θTxi)1−yi]∂θ∂(g(θTxi))=−n1i=1∑n[g(θTxi)yi−1−g(θTxi)1−yi]g(θTxi)(1−g(θTxi))∂θj∂θTxi=−n1i=1∑n[yi(1−g(θTxi))−(1−yi)g(θTxi)]xij=−n1i=1∑n(yi−g(θTxi))xij=n1i=1∑n(g(θTxi)−yi)xij=n1i=1∑n(hθ(xi)−yi)xij(11)
这里使用梯度下降法进行参数更新,更新公式如下:
θj=θj−αn1i=1∑n(hθ(xi)−yi)xij(12)
需要注意的是这里的参数θ是包含W和B的参数。
3、代码
def sigmoid(inX):
return 1.0/(1+exp(-inX))
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn) #convert to NumPy matrix
labelMat = mat(classLabels).transpose() #convert to NumPy matrix
m,n = shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
for k in range(maxCycles): #heavy on matrix operations
h = sigmoid(dataMatrix*weights) #matrix mult
error = (labelMat - h) #vector subtraction
weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
return weights