一、前言

之前我们说到有关线性回归的一些内容,有兴趣的小伙伴可以去看一下。
这一章我们主要说一下逻辑回归。逻辑回归和线性回归有区别但是更有联系。
就从逻辑回归的作用来看,我觉得它不应该叫逻辑回归,而应该叫回归逻辑,或者更直白一点叫:线性回归后的逻辑化分类算法。
没错,逻辑回归不是回归算法,而是分类算法。
为什么我们得出了线性回归的结构之后还要记性逻辑回归呢,其实很简单,这个就像我们大学考试拿等级一样,比如9090分以上的人可以拿到A,9090分以下的是B,而只有A等级在最后计算绩点时可以加分,这个时候你的考试分数往往不够直观,我们就需要等级化,这里的具体的考试分数可以看成线性回归的结果,而A、B等级就是逻辑回归的结果,这个90分就是一个阈值。
或者在看一个例子,又是借贷款的问题,借贷银行对你的综合情况进行评估(线性回归过程),最终得出了一个可贷估计值(假设范围是0~1),如果可贷估计值在[0,0.5)[0,0.5),银行不借贷,如果在[0.5,1][0.5,1],银行借贷(逻辑回归过程)。

二、sigmoid 函数

我们说过,逻辑回归就是将线性回归产生的结果进行二分化,既然是二分化我们就需要寻找一个阈值作为二分的标准,这个时候就需要用到sigmoidsigmoid函数,sigmoidsigmoid函数不光可以实现一个阈值对数据进行二分化,由于其值域是0~1,所以sigmoidsigmoid函数可以很好的表示概率。
sigmoidsigmoid 函数的表达式为:
g(z)=11+ez g(z)={1\over{1+e^{-z}}}
讲$y=\theta^Tx $代入其中便可以得到:
hθ(x)=g(θTx)=11+eθTx h_\theta(x)=g(\theta^Tx)={1\over{1+e^{-{\theta^Tx}}}}
函数的图像如下所示:
第二章 机器学习算法之逻辑回归

三、逻辑回归的损失函数(目标函数)

由于逻辑回归是一个分类算法,所以我们的损失函数也显得很离散:
cost(hθ(x),y)={log(hθ(x))y=1log(1hθ(x))y=0 cost(h_\theta (x),y)=\begin{cases} -log(h_\theta (x))&y=1\\ -log(1-h_\theta (x))&y=0 \end{cases}
完整的损失函数为:
cost(hθ(x),y)=i=1nyilog(hθ(x))(1yi)log(1hθ(x)) cost(h_\theta (x),y)=\sum_{i=1}^n-y_ilog(h_\theta (x))-{(1-y_i)}log(1-h_\theta (x))
看到这里是不是觉得特别抽象,那么我就来带大家理一下:
假设有一个老师对四位同学分别根据平时表现,对专业的态度,学习效率等多方面进行学习成绩评估得出了预测结果(也就是下表的线性回归结果),并将90分以上定为等级A(也就是二分类中的类别1),90分以下定为等级B(也就是二分类中的类别0),好了,考试结果出来了,几位同学的成绩和老师的预测结果存在一些一些出入,现在需要对评估标准进行调整,我们将产生的偏置代入sigmoidsigmoid函数计算出概率,我们还知道有的预测对了有的预测错了。

样本 线性回归结果 真实结果 偏置 sigmoid结果(概率) 预测对错
小红 88 91 -2 0.112
小橙 91 93 1 0.734
小橙 99 100 9 0.999
小橙 81 89 -9 0.0001

那么损失函数值是多少呢?
cost(hθ(x),y)=(1log(0.112)+1log(0.734)+1log(0.999)+0log(0.0001))=1.09 cost(h_\theta (x),y)=-(1*log(0.112)+1*log(0.734)+1*log(0.999)+0*log(0.0001))=1.09

三、梯度下降法优化逻辑回归算法

这一下节如果看不懂,建议复习线性回归
梯度下降法不仅可以用在逻辑回归上,还可以用在线性回归上。他的主要思想是通过迭代的方法让函数收敛到一个最小值。
具体算法如下:
首先选取一个初始点
求这一点在几个方向上的梯度最大值
设置学习率更新初始点
下面我们从一个二维函数开始看起
假设我们有一个二次函数: y=x2y=x^2,并且我们不知道它的最低点是(0,0)(0,0)
那么我们首先选取一个初始点为(1,1)(1,1)
然后我们发现这一点的导数: y=2xy'=2x,二维情况下肯定也就只有这个方向梯度最大(毕竟只有这一个梯度)。
然后又我们设置一个学习率: α=0.4\alpha=0.4
所以此时便可以迭代出一个新的点的横坐标():x(1)=xαy(1)=0.2x^{(1)}=x-\alpha\cdot y'(1)=0.2
以此类推:
x(2)=x(1)αy(0.2)=0.04x(3)=x(2)αy(0.04)=0.008... \begin{array}{cc} x^{(2)}=x^{(1)}-\alpha\cdot y'(0.2)=0.04\\ x^{(3)}=x^{(2)}-\alpha\cdot y'(0.04)=0.008\\ ... \end{array}
你会发现,迭代之后逐渐趋近最低点
这里我们需要的就是目标函数的梯度(对于一维来说也就是导数),梯度的方向就是变化率最大的方向,梯度的值就是变化率最大方向对应的变化率,上面小节我们已经知道了目标函数以及梯度:
J(θ)=12i=1n(y(i)θTx(i))2=12(Xθy)T(Xθy)θJ(θ)=XTXθXTy \begin{array}{cc} J(\theta)={1\over2}\sum_{i=1}^n{({y^{(i)}-\theta^Tx^{(i)}})^2}={1\over2}(X\theta-y)^T(X\theta-y)\\ \nabla_\theta J(\theta)=X^TX\theta-X^Ty \end{array}
这个时候我们就可以按照上面的思路对θ\theta进行迭代,此时XX以及yy均是已知的常数矩阵。
但是啊但是,梯度下降法很容易陷入局部最优,这个问题目前也比较棘手,没有特别好的解决方法。

相关文章: