代码改变世界

逻辑回归

2013-06-05 21:11  jzl  阅读(1085)  评论(0)    收藏  举报

上一篇中,把线型回归(其他回归类似)的步骤可概括为:

1. 找到假设函数H

2.找到合适的Cost函数J

3 最小化函数J,按照下面的思路:

      下一个值 = 当前值 + 步长 * 方向

        如何定步长和方向是关键,可能需要不断的尝试

4.写程序,调试

对于逻辑回归,步骤是一样的。

1.逻辑回归的用处

逻辑回归主要用于分类,如下图,即把两类点分开。如下图1

Logistic1

                                            图1   示例数据

数据的格式为:

35.8 , 72.9 , 0
60.2 , 86.3 , 1

有两个特征,两个特征(x1 , x2)为(35.8 , 72.9)时,y为0,称为负点(negative)

当(x1,x2)为(60.2 , 86.3)时,y为1,称为正点(positive)

 

根据训练数据,通过一定的手段,回归出可以区分上图黑点和红点的函数。然后,对于新数据,可以进行分类。

2.逻辑回归的假设函数

观察上图1,可以猜测,线型方程就可以把两类点进行很好的区分,假设线型方程为L = a*X1 + b*X2 +c,假设函数为

        h(L) = g(L) = 1/( 1+exp(-L) )

其中:g(z) = 1/( 1+exp(-z) )

下面是其数学形式

G

g(z)称为逻辑函数或者sigmoid函数。

g(z)的图像如下图:

gPlot

g(z)函数有一些几点需要注意:

  • g(z)的值域在(0,1)
  • 当z很小时,g(z)趋向于0;z很大时,g(z)趋向于1
  • g(0)=0.5,以0点会分界线,当g(z)>0.5时,z点可以正点(Positive);g(z)<0.5时,z点为负点(negative)

 

3.Cost函数J

Cost函数可以通过概率相关知识进行推导,具体可以参考<<机器课程学习资料>>的note1.pdf。下载地址

https://skydrive.live.com/?cid=2A97F342653F7440&id=2A97F342653F7440%21107

这里直接给出其形式:

costj

                                                                                        公式1

 

可以不探究公式是怎么来的,但是可以根据它的形式分析一下。我们的目的是最小化Cost函数。注意,y只能去0或者1,h(x)在(0,1)之间

1. 把y=0带入,得sum( log( 1-h(x)  ) ),可以看到此时h(x)越小,Cost函数越小,理想情况下,h(x)能无限接近0

2.把y=1带入,得sum(  log h(x)  ),此时h(x)越大,Cost函数越小,理想情况下,h(x)能无限接近1。

所以最小化公式1,即是h(x)与y的距离最小。

 

4.迭代公式

下一个值 = 当前值 + 步长 * 方向

其中方向为对公式1中的 l  求偏导

迭代

 

而对 l 求偏导后,形式异常的简单:

l

 

然后逻辑回归的形式,居然和线性回归一样( 当然h(x)不一样 )

5.代码

形式和线性回归一样,那代码就没什么好说的了,只是把h(x)表示换一下就行,这里不就贴代码了,下载看一下就行。

result

需要注意的是,刚开始时,我把相关参数的初值都设为0,回归结果非常不稳定。

通过观察可以知道直线的方程大概为,l = x1+x2-90,所以把初值设成,a=1,b=1,c=-90。

这里就涉及到初值选取的问题,能不能找到不依赖于初值的算法?

www.coursera.org上的课程中,使用的是Octave中的fmincg函数,没有初值选取的问题,fmincg的代码可以去下面这个网址去看一下,我暂时没看懂,囧。。

http://stackoverflow.com/questions/12115087/octave-logistic-regression-difference-between-fmincg-and-fminunc