机器学习——分类算法之逻辑回归

前言

逻辑回归也被称为对数机率回归,注意这里面说的回归并不是真正意义上的回归算法,其实它是一个经典的分类算法,至于为什么会有“回归”命名,后面会讲到。

逻辑回归(Logistic Regression)

1、Sigmoid函数

说逻辑回归算法之前必须整明白Sigmoid函数!!
Sigmoid函数表达式:
g(z)=11+ez(1)g(z)=\frac{1}{1+e^{-z}}\tag{1}
其函数图像如下:
在这里插入图片描述
其自变量取值为任意实数,值域为[0,1],将任意的输入映射到了[0,1]区间,如果在线性回归中得到一个预测值,再将该值映射到Sigmoid函数中,这样就完成了由值到概率的转换,也就是分类任务。逻辑回归计算法就是这个思想。

2、算法推导

首先表示一些变量

X={x1,x2,...,xn}X=\{x_{1},x_{2},...,x_{n}\}表示n个样本
W={w1,w2,...,wn}W=\{w_{1},w_{2},...,w_{n}\}表示每个样本对应的系数
B={b1,b2,...,bn}B=\{b_{1},b_{2},...,b_{n}\}表示偏置项
Y={Y1,Y2,...,YN}Y=\{Y_{1},Y_{2},...,Y_{N}\}表示线性回归算法得到的回归值
那么,由线性回归算法可知每个样本对应的回归值:
Y=(Y1Y2...Yn)=(w1,w2,...,wn)(x1x2...xn)+(b1b2...bn)=WTX+B(2)Y=\begin{pmatrix} Y_{1}\\ Y_{2}\\ ...\\ Y_{n} \end{pmatrix}=\begin{pmatrix} w_{1},&w_{2} , &... , & w_{n} \end{pmatrix}\begin{pmatrix} x_{1}\\ x_{2}\\ ...\\ x_{n} \end{pmatrix}+\begin{pmatrix} b_{1}\\ b_{2}\\ ...\\ b_{n} \end{pmatrix}=W^{T}X+B\tag{2}
化简下(2)式:
θ=(W;B),X^=(X;1)\theta=(W;B),\widehat X=(X;1),那么
Y=θTX^(3)Y=\theta^{T} \widehat X\tag{3}

如上面红色字体所述,将线性回归算法得到的回归值(3)带入到Sigmoid函数(1)(令z = Y)中:
hθ(X^)=g(Y)=g(θTX^)=11+eθTX^(4)h_{\theta}(\widehat X) = g(Y)=g(\theta^{T} \widehat X)=\frac{1}{1+e^{-\theta^{T}\widehat X}}\tag{4}

此处就该说明为什么该算法针对分类问题,但是还叫他"回归":
x现在简单表达下式(4),线性回归z=wTx+b,y=11+ezz= w^{T}x+b,带入逻辑回归y= \frac{1}{1+e^{-z}}中,得:


y=11+e(wTx+b)(这里记为式a)y= \frac{1}{1+e^{-(w^{T}x+b)}}\tag{这里记为式a}
再简单变换下:
lny1y=wTx+bln\frac{y}{1-y}=w^{T}x+b

若将y视为样本x作为正例的可能性,则1-y是其反例可能性,两者的比值y1y\frac{y}{1-y}称为机率,对机率取对数则得到对数机率lny1yln\frac{y}{1-y},这样的话,式a实际上是在用线性回归模型的去逼近真实标记的对数机率,因此被称为“对数机率回归”。

令y表示分类任务的分类标签,那么有:
P(y=1X^;θ)=hθ(X^)(5)P(y=1|\widehat X;\theta)=h_{\theta}(\widehat X)\tag{5}
P(y=0X^;θ)=1hθ(X^)(6)P(y=0|\widehat X;\theta)=1-h_{\theta}(\widehat X)\tag{6}
将(5)和(6)合起来,可以写成如下形式:
P(yX^;θ)=(hθ(X^))y(1hθ(X^))1y(7)P(y|\widehat X;\theta)=(h_{\theta}(\widehat X))^{y}(1-h_{\theta}(\widehat X))^{1-y}\tag{7}
为了求出最优参数θ\theta,下面就开始了极大似然估计的套路了(关于极大似然估计参见本人的另一篇博文
L(θ)=i=1nP(yixi;θ)=i=1n(hθ(xi))y(1hθ(xi))1y(8)似然函数:L(\theta)=\prod_{i=1}^{n}P(y_{i}|x_{i};\theta)=\prod_{i=1}^{n}(h_{\theta}(x_{i}))^{y}(1-h_{\theta}(x_{i}))^{1-y}\tag{8}
上式取对数:
l(θ)=lnL(θ)=i=1n[yilnhθ(xi)+(1yiln(1hθ(xi)))](9)l(\theta)=lnL(\theta)=\sum_{i=1}^{n}[y_{i}lnh_{\theta}(x_{i})+(1-y_{i}ln(1-h_{\theta}(x_{i})))]\tag{9}
取式(9)的极大值,这里将问题转换成求其极小值,即:
argmaxθl(θ)=argminθ1nJ(θ)=1ni=1n[yilnhθ(xi)+(1yi)ln(1hθ(xi))](10)\underset{\theta}{argmax} l(\theta)=\underset{\theta}{argmin}-\frac{1}{n}J(\theta)=-\frac{1}{n}\sum_{i=1}^{n}[y_{i}lnh_{\theta}(x_{i})+(1-y_{i})ln(1-h_{\theta}(x_{i}))]\tag{10}
式(10)就是逻辑回归的损失函数
对式(10)关于θ\theta求导
θjJ(θ)=1ni=1n[yihθ(xi)(hθ(xi))θj1yi1hθ(xi)(hθ(xi))θj]=1ni=1n[yig(θTxi)1yi1g(θTxi)](g(θTxi))θ=1ni=1n[yig(θTxi)1yi1g(θTxi)]g(θTxi)(1g(θTxi))θTxiθj=1ni=1n[yi(1g(θTxi))(1yi)g(θTxi)]xij=1ni=1n(yig(θTxi))xij=1ni=1n(g(θTxi)yi)xij=1ni=1n(hθ(xi)yi)xij(11)\frac{\partial}{\partial \theta_{j}}J(\theta)=-\frac{1}{n}\sum_{i=1}^{n}[\frac{y_{i}}{h_{\theta}(x_{i})}\frac{\partial(h_{\theta}(x_{i}))}{\partial \theta_{j}}-\frac{1-y_{i}}{1-h_{\theta}(x_{i})}\frac{\partial(h_{\theta}(x_{i}))}{\partial \theta_{j}}]\\=-\frac{1}{n}\sum_{i=1}^{n}[\frac{y_{i}}{g(\theta^{T}x_{i})}-\frac{1-y_{i}}{1-g(\theta ^{T}x_{i})}]\frac{\partial (g(\theta^{T} x_{i}))}{\partial\theta}\\=-\frac{1}{n}\sum^{n}_{i=1}[\frac{y_{i}}{g(\theta^{T}x_{i})}-\frac{1-y_{i}}{1-g(\theta ^{T}x_{i})}]g(\theta^{T}x_{i})(1-g(\theta^{T}x_{i}))\frac{\partial \theta^{T}x_{i}}{\partial \theta_{j}}\\=-\frac{1}{n}\sum^{n}_{i=1}[y_{i}(1-g(\theta^{T}x_{i}))-(1-y_{i})g(\theta^{T}x_{i})]x_{i}^{j}=-\frac{1}{n}\sum^{n}_{i=1}(y_{i}-g(\theta^{T}x_{i}))x_{i}^{j}\\=\frac{1}{n}\sum^{n}_{i=1}(g(\theta^{T}x_{i})-y_{i})x_{i}^{j}=\frac{1}{n}\sum^{n}_{i=1}(h_{\theta}(x_{i})-y_{i})x_{i}^{j}\tag{11}
这里使用梯度下降法进行参数更新,更新公式如下:
θ^j=θjα1ni=1n(hθ(xi)yi)xij(12)\widehat\theta_{j}=\theta_{j}-\alpha\frac{1}{n}\sum^{n}_{i=1}(h_{\theta}(x_{i})-y_{i})x_{i}^{j}\tag{12}
需要注意的是这里的参数θ\theta是包含WWBB的参数。

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章