机器学习:对数几率回归(附代码)
对数几率回归(Logistic Regression),简称为对率回归,也称逻辑斯蒂回归,或者逻辑回归。虽然它被很多人称为逻辑回归,但是中文的“逻辑”一词与“logistic”和“logit”意思相去甚远。它是广义的线性模型,只是将线性回归方程中的y换成了ln[p/(1-p),p是p(y=1|x),p/(1-p)是“几率”。对数几率回归是用来做分类任务的,所以,需要找一个单调可微函数,将分类任务的
文本首发于AI柠檬博客,原文链接:
对数几率回归(Logistic Regression),简称为对率回归,也称逻辑斯蒂回归,或者逻辑回归。虽然它被很多人称为逻辑回归,但是中文的“逻辑”一词与“logistic”和“logit”意思相去甚远。它是广义的线性模型,只是将线性回归方程中的y换成了ln[p/(1-p),p是p(y=1|x),p/(1-p)是“几率”。对数几率回归是用来做分类任务的,所以,需要找一个单调可微函数,将分类任务的真实标记和线性回归模型的预测值联系起来。
一元对率回归
既然是做0和1的二分类,我们肯定会想到“单位阶跃函数”,这是最理想的一种。但是,我们都知道,单位阶跃函数不是单调可微函数,因为它不连续。为了在之后通过各种数值优化(比如梯度下降)求取最优解的时候能够很方便,所以,我们希望能找到一种能在一定程度上近似单位阶跃函数的“替代函数”,并且单调可微,是任意阶可导的凸函数。我们通常使用这样一种S型函数(Sigmoid Function)来替代它:
其中,z = θT * x + b.
Sigmoid函数(蓝)与单位阶跃函数(红)
我们刚才说,对数几率回归是用来实现分类任务的,包括基于此的感知机(Perceptron)和神经网络模型(Neural Network model),都是用来进行分类的。我们给定一个输入值,如果y是样本x作为正例的可能性,那么1 – y就是其反例的可能性。如果y>0.5,那么我们可以认为结果属于正例,将其划分为1类,否则划分为0类。虽然,这种方法名为“回归”,但是这样却实现了分类,而且,我们还可以得到近似概率的预测,这对很多需要利用概率辅助决策的任务有很大作用。
训练对数几率回归的方法跟线性回归一样,同样是定义一个代价函数(Cost Function),并且通过优化算法最小化我们的代价函数,这里我们仍然使用梯度下降来实现。不过,MATLAB里提供了一个最小化函数fminunc(),你可以直接使用它来实现梯度下降,当然,自己动手实现一次梯度下降是最好的。通过梯度下降,我们使得代价函数最小,训练得参数theta,然后带入机器学习模型中。
通过对数极大似然(Maximum Likelihood Method)估计,将其转化为凸函数之后,可得对数几率回归的代价函数定义如下:
其中,m为样本数量。
它的梯度Grad定义为:
参数更新时的迭代公式:
θj = θj – α * Grad
(Grad为梯度)
我们要做二分类训练的数据为:
X | 0 | 2 | 5 | -1 | -3 | 4 | -0.1 | 0.5 | 9 | -6 | -4 | -3 | -2 | 1 | 8 | -7 | 6 | 3 | 1.5 | 0.5 |
Y | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
我们可以分别使用最小化函数fminunc()和自实现的梯度下降来进行机器学习训练,具体代码见文章最后,结果分别为:
fminunc函数:
theta =
-1.7418
1.8137
cost =
0.2007
梯度下降自实现:
theta =
-1.7417
1.8136
cost =
0.2007
我们可以看到,内置函数和自实现的梯度下降计算得到的结果几乎一样,而且得到的图像也是没有区别的。之后,我们便可以使用训练得到的机器学习模型来预测我们想要预测的事情了。
不过,我前面说过,对数几率回归是感知机和神经网络模型的组成基础,所以我们可以以感知机或神经网络的角度来看待它。将一个对数几率回归看成一个神经元,其参数的训练看成神经元的参数训练,只不过它不含隐藏层而已。本例中的模型可以看成:
该例代码在这里:https://blog.ailemon.net/2017/02/12/machine-learning-logistic-regression-1/
多元对率回归
这一段我想写一下关于二元的对数几率回归的内容,相关的知识可以推广到多元的对数几率回归。二元乃至多元的模型就初步有了神经网络的感觉,当然,此时仍然没有隐藏层。二元的模型常常是用来做平面的数据分类的,因此我打算用一个我定义的二元数据来解释一下这个模型。
首先,我定义(即为所收集数据的实际模型)为X+Y<1的为0类即反例,否则为1类即正例,其中,个别数据允许有错误。那么,我们可以有如下数据:
X1 | 1 | 0.5 | 0.4 | -1 | -0.5 | -0.5 | 0.5 | 0.5 | 0 | 0 | 2 | 1.5 | 1.5 | 0.5 | 1.2 | 0.8 |
X2 | 2 | 1.5 | 2 | 0 | -0.5 | 0.5 | -0.5 | 0 | 0.5 | 0 | 0.4 | 0 | 1.5 | 0.4 | 1.5 | 0.7 |
Y | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 |
在上一篇文章中,我们的数据是单变量的,所以数据读入之后它是一个列向量,而在本文中,每一组数据包含2个变量,有16组数据,所以最终输入时是16*2的矩阵,当然,对应的标记Y仍然是一个列向量。
同样,我们仍然使用Sigmoid函数来作为拟合函数,代价函数和梯度的定义还是一样的,梯度下降时参数theta的迭代公式也不变。我们继续分别使用最小化函数fminunc()和自实现的梯度下降来进行机器学习训练。本篇的重点在于理解如何从单变量的统计回归模型推广到多变量模型中去,一旦理解了这一点,我们就可以将其推广到任意维度。
经过训练,我们可以得到结果:
fminunc函数:
theta =
-24.8399
24.0879
16.8938
cost =
3.7364e-04
梯度下降自实现:
theta =
-23.4586
21.8901
17.0033
cost =
3.7364e-04
本例中,该对数几率回归模型可以看作输入层有两个神经元输出层一个神经元并且没有隐含层的神经网络,同上篇文章一样,我省去了偏置神经元(即常数项)。
本例代码请看:https://blog.ailemon.net/2017/02/14/machine-learning-logistic-regression-2/
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)