LOGISTIC REGRESSION的讲解与实现
2016-03-19 18:35:50
好了,这次我们开始讲logistic regression
,这个东西其实很玄幻,首先他虽然叫回归,但并不是类似线性回归
那用做预测的,而是拿来做分类的
然后这个东西,在andrew ng的machine learning课上,一开始我是感觉听懂了,但是实质到了实战,就一脸递归懵逼,而在《机器学习实战》书中,对这个算法的实现一笔带过,当时我就震惊了,这怎么玩,之后查了大量资料才知道这东西是怎么做的
首先要讲的是梯度上升法:
梯度上升法
这个是一个优化算法
首先呢,你先要有一个函数:f(x1,x2......)=a1x1+a2x2+....anxn+an+1
把它画出来就是这样(别吐槽,我用在线html5画板鼠标画的)
然后,我们希望找到他的局部最优解,最下降的解法,那么我们肯定是用f
对于 某个 xn
的微分了
函数的微分:
然后将他乘上一个步长a,这样,原值加上步长,那么这个点就会向最低点移动,最后迭代很多次后,就会到达最低点了,以为最低点的微分为0
这样,就可以这么跑了
类似这样,就会一点点的靠近最低点,这里的步长a要取小一点
因为取大了的话,会这样:
这样不断迭代,就可以取得最优解
LOGISTIC模型
首先,按照andrew ng的说法,你必须找到你的h(x)
,显然,该函数的输出必须是两个值(分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:
你要表达的是,是与不是,而这个函数,输入的数要么接近于一,要么接近于令,当他取零时,得到值0.5
在andrew ng的课程中,你的h(x)
是能分开两者的,类似:
或者
这也就是说,你的h(x)
是能把数据的分类概率作为你回归的标准,一步步地进行回归操作,最后得到一个概率分布的线
那么我们的h(x)
就这么定:
得到:
这样,你就得到了概率分布的曲线,将每个值带入h(x)
能得到最终“正确”或“否定”的概率:
按照之前我们做线性回归的例子:
构造一个cost函数,让cost函数与h(x)相减,使这个函数的微分最小,那么得到的就是最优化的h(x)
所以最后,经过数学推到,我们得到我们的cost function
:
为了带进梯度上升算法,我们必须对cost function
进行求导:
最后我们可以得到我们要做梯度上升算法的式子:
也就是:
好的,只要我们不断迭代这个式子,我们就可以找到最优化的logistic的概率分布曲线
其实对于logistic,最麻烦的是要理解他的概率分布,之前我们的做分布,通过欧式距离来建立数据的关系,然而对于logistic,我们用的是概率来计算发生和不发生这两种状态
所以比较麻烦,现在给出《机器学习实战》里面的例程:
它是直接使用numpy
,使用向量去做的,所以很多细节,需要大家脑补,不过,整个数学推到的算法是在前面的这些:
#sigmoid函数
def sigmoid(inX):
return 1.0/(1+exp(-inX))
def gradAscent(dataMatIn,classLabels):
dataMatrix=mat(dataMatIn)
labelMat=mat(classLabels).transpose()
m,n=shape(dataMatrix)
#步长a
alpha=0.001
#上升梯度算法的迭代次数
maxCycle=1000
weights=ones((n,1))
for k in range(maxCycle):
#得到与标准值的错误的概率
h=sigmoid(dataMatrix*weights)
#我们得到的公式
error=(labelMat-h)
weights=weights+alpha*dataMatrix.transpose()*error
return weights
测试数据运行的结果:
这里必须吐槽一下《机器学习实战》里面这里的讲解为无,当时看的一头雾水,最后是去看了andrew ng的课程,然后动手找了大量的资料才知道这个怎么弄,《统计学习方法》是本好书呀!!
图片来自:
- andrew ng的machine learning公开课
参考资料:
- 《机器学习实战》
- 《统计学习方法》
- andrew ng 的machine learning公开课
- 洞庭之子博客