机器学习基石(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.001
13     #最大迭代次数
14     max_iteration = 500
15     #先创造一个1的array赋值给w
16     w= ones((j,1))
17     for k in range(max_iteration):
18         #遍历每一个k,优化w
19         h = sigmoid(dataMat*w)
20         error = (labelMat - h)
21         w = w + eta*dataMat.T*error
22         return w

 

posted @ 2016-09-28 09:28  cyoutetsu  阅读(417)  评论(0编辑  收藏  举报