首页 > 代码库 > 机器学习基石(10)--Logistic Regression
机器学习基石(10)--Logistic Regression
如果我们想要知道的并不是绝对的是或者非,我们只想知道在是非发生的概率(只想知道概率,不想知道结果)是多少的时候:
虽然我们想要知道左边的完美数据,但是在实际生活中,我们只有右边的数据,也就是一些确定的结果,不可能有概率值这个事情让我们知道。而右边的数据可以看成是有噪声的不完美的数据。
怎么解决这样的问题呢?
有一种叫做sigmoid的函数可以满足这些要求。
这个函数(logistic function)可以把任何数转化成0到1之间的值。那么logistics regression的Ein怎么衡量呢?
假设我们的hypothesis h和真实的f差不多,那么他们两个产生同样结果的概率也差不多。而f真正产生这个结果的几率是很大的。
→→
此时,我们就可以把问题转换成,找一个几率最大的h就行了。
由于logistic function的一个特点:1–h(x)=h(–x),可以得出h的概率为:
likelihood(h) = P(x1)h(+x1)×P(x2)h(–x2)×......P(xN)h(–xN)
= P(x1)h(x1)×P(x2)h(y2x2)×......P(xN)h(yNxN)
我们的目标就是最大化这个likelihood。
现在的目标是找一个w使得Ein最小。
又是一个凸函数,目标还是找出谷底在哪里。于是我们可以用替换的方式来解这个微分方程。
最后我们得出下图这样的解,和Linear Regression一样,找梯度是0的点;但是又和Linear Regression不一样,这不是一个线性方程式,所以要找另外一种解法。
先复习一下PLA的知错能改的解法:
上式有两个关键的地方:
(1)v:表示更新的方向(往哪个方向走)
(2)η:表示更新的大小(每次走几步)
所以抽象提炼一下,每次更新需要知道方向和该方向的长度即可:
想象一个往山谷谷底滚的球。我们需要知道滚的方向和每次滚多远。如果想要滚得很快,我们每次就挑找山谷最陡的地方往下滚。所以可以得出:
这个式子还不是线性的,我们还是没有办法解它,但是我们可以用泰勒展开(多维度)来求解:
于是我们把方程变成了关于vT的线性方程。
当两个向量是完全反方向的时候,这两个向量的内积才会最小,才会有min的效果。因为我们要求v是单位向量,所以Ein(wt)也要normalize一下。这就是梯度下降的方法。
在推导梯度下降的时候,假定η是已知的,但是我们回头来看怎么选择η呢?
选择固定的或大或小的η都不合适,我们可以选择动态的η,使得在坡度大的时候往前走的多一点,坡度小的时候往前走的少一点。η应该和坡度成正相关。
fixed learning rate是一个固定的η,因为这个learning rate是原来η和坡度的比例系数,我们可以替代之前动态的η。
总结:
逻辑回归:
优点:计算代价不高,易于理解和实现。
缺点:容易欠拟合,分类精度可能不高。
适用:数值型和标称型数据。
1 #先定义一个sigmoid函数 2 def sigmoid(inX): 3 return 1.0/(1+exp(-inX)) 4 #开始计算随机梯度下降 5 def GradientDscent(data,label): 6 #将data和label矩阵化 7 dataMat = mat(data) 8 labelMat = mat(label).T 9 i,j = shape(data)10 #设置一些梯度下降算法所需要的参数11 #每次的步长12 eta = 0.00113 #最大迭代次数14 max_iteration = 50015 #先创造一个1的array赋值给w16 w= ones((j,1))17 for k in range(max_iteration):18 #遍历每一个k,优化w19 h = sigmoid(dataMat*w)20 error = (labelMat - h)21 w = w + eta*dataMat.T*error22 return w
机器学习基石(10)--Logistic Regression