机器学习实战(基于scikit-learn和TensorFlow)学习心得(23)--逻辑回归 Logistic Regression
我看了很多的资料,大部分的资料将这款都是从前向后讲,先将公式,讲理论,然后再说怎么做,搞的人一头雾水.
我这次从后往前讲,先将怎么做,再将为什么这么做.
首先我们先看单纯的线性回归方程:
如果我们用矩阵的形式表示这个函数就是
那么y的取值范围是什么?是[].
按照我之前说的,我们先讲我们要怎么做,再讲我们为什么要这么做.
我们想把y的取值范围变成[0,1]怎么办呢?
很简单,我们把线性回归得到的结果再作为一个特征值传入一个新的函数,经过转换,将其转换成一个值域在[0,1]之间的值
其中,这个是sigmoid函数,那么这个函数的图相是什么样子的呢?
图1
这个函数有很好的特性,首先他的取值范围在[0,1].其次,在t=0的点y=0.5,换句话说,当t>0的时候σ(t)>0.5,当t<0的时候σ(t)<0.5.
对于概率来讲,这是个非常优秀的函数,基本上涵盖了我们对概率的最基本的认知.
好!这时候有意思的来了!我们讲了怎么做,下面我们将为什么做.
看到这张图,假设我们有10个样本,其中圆形有5个,三角形有5个.我们想通过一条线最大程度的讲两种类型的样本隔绝开来,那么绿色的线就是我们想找的这条线.在绿色的线上面都归于圆,在绿线之下都归于三角形.如果一个新的样本进来,这条直线会查看这个样本在这条线的什么位置,然后做出判断.
那么这条线怎么找到呢?
还记得我们做线性回归的时候如何找到那条线的吗?我们没有去找这条线,我们只是假设了一个初始值,然后通过设置一个cost function 通过梯度下降法让系统自己去找最优解.好那么再深入的问一下cost function是什么呢?就是我们想要的结果跟我们现在的结果的差值,换句话说就是能衡量我们想要的系统的好坏的一个方程.cost function越小我们的系统就越好.
所以这个问题就变成了我们怎么找到一个合适的cost function去代表我们想要的结果的误差?
我们先想一下我们找这个cost function的逻辑是什么,从图1看
1. 假设原本样本y=1,而t越小算出来的y'越小,则cost越大
2. 假设原本样本y=0,而t越大算出来的y'越大,cost越大
为什么呢,我们想当y=1的时候也就是说明这个样本铁是方块,而t越小则说明体统认为这个东西属于三角的概率越大这样说明误差过大.反过来亦然.
cost function就是
我们整理成一个式子就是
当y=1时,p趋近于零的时候,在这个时候可以看此时-log(p)趋近于正无穷,这是因为当p趋近于0的时候,按照我们之前的这个分类的方式,我们就会把这个样本分类成0这一类,但是这个样本实际是1这一类,显然我们分错了,那么此时我们对它进行惩罚,这个惩罚是正无穷的,随着p逐渐的增高,可以看我们的损失越来越小,当我们的p到达1的时候,也就是根据我们的分类标准,我们会将这个样本x分类成1,此时,它和这个样本真实的y等于1是一致的,那么此时损失函数取0也就是没有任何损失,当y=0时同理.
我们现在可以开始整理了
两个式子一综合
剩下的就是用梯度下降法求解这个方程的最优解了.
该解法转载自VitoLin
上述式子中所有的θ都是在sigmoid函数中,那么先对sigmoid函数求导数
那么logσ(t)的导数呢?
由此可知, 前半部分的导数:
其中y(i)是常数
再求后半部分:
这其中
将结果代入,化简得:
就得到后半部分的求导结果:
将前后部分相加:
既:
就可以得到:
此时我们回忆一下线性回归的向量化过程
参考这个,可以得到: