Logistic 回归总结


Logistic 回归总结 作者:靠谱哥 微博:洞庭之子-Bing (2013 年 11 月) (本文为作者原创,转载请注明出处) 出处:http://blog.csdn.net/dongtingzhizi/article/details/15962797 1 引言 看了 Stanford 的 Andrew Ng 老师的机器学习公开课中关于 Logistic Regression 的 讲解,然后又看了《机器学习实战》中的 Logistic Regression 部分,写下此篇学 习笔记总结一下。 首先说一下我的感受,《机器学习实战》一书在介绍原理的同时将全部的算法 用源代码实现,非常具有操作性,可以加深对算法的理解,但是美中不足的是 在原理上介绍的比较粗略,很多细节没有具体介绍。所以,对于没有基础的朋 友(包括我)某些地方可能看的一头雾水,需要查阅相关资料进行了解。所以 说,该书还是比较适合有基础的朋友。 本文主要介绍以下三个方面的内容: (1) Logistic Regression 的基本原理,分布在第二章中; (2) Logistic Regression 的具体过程,包括:选取预测函数,求解 Cost 函数和  J  ,梯度下降法求  J  的最小值,以及递归下降过程的向量化 (vectorization),分布在第三章中; (3) 对《机器学习实战》中给出的实现代码进行了分析,对阅读该书 Logistic Regression 部分遇到的疑惑进行了解释。没有基础的朋友在阅读该书的 Logistic Regression 部分时可能会觉得一头雾水,书中给出的代码很简单, 但是怎么也跟书中介绍的理论联系不起来。也会有很多的疑问,比如: 一般都是用梯度下降法求损失函数的最小值,为何这里用梯度上升法呢? 书中说用梯度上升发,为何代码实现时没见到求梯度的代码呢?这些问 题在第三章和第四章中都会得到解答。 文中参考或引用内容的出处列在最后的“参考文献”中。文中所阐述的内容仅 仅是我个人的理解,如有错误或疏漏,欢迎大家批评指正。下面进入正题。 2 基本原理 Logistic Regression 和 Linear Regression 的原理是相似的,按照我自己的理解, 可以简单的描述为这样的过程: 1. 找一个合适的预测函数(Andrew Ng 的公开课中称为 hypothesis),一般表 示为 h 函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判 断结果。这个过程时非常关键的,需要对数据有一定的了解或分析,知道或 者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。 2. 构造一个 Cost 函数(损失函数),该函数表示预测的输出( h )与训练数 据类别( y )之间的偏差,可以是二者之间的差( h y )或者是其他的形 式。综合考虑所有训练数据的“损失”,将 Cost 求和或者求平均,记为  J  函数,表示所有训练数据预测值与实际类别的偏差。 3. 显然,  J  函数的值越小表示预测函数越准确(即h 函数越准确),所以 这一步需要做的是找到  J  函数的最小值。找函数的最小值有不同的方法, Logistic Regression 实现时有的是梯度下降法(Gradient Descent)。 3 具体过程 3.1 构造预测函数 Logistic Regression 虽然名字里带“回归”,但是它实际上是一种分类方法, 用于两分类问题(即输出只有两种)。根据第二章中的步骤,需要先找到一 个预测函数( h ),显然,该函数的输出必须是两个值(分别代表两个类别) ,所以利用了 Logistic 函数(或称为 Sigmoid 函数),函数形式为: 1(z) 1 zg e  (1) 对应的函数图像是一个取值在 0 和 1 之间的 S 型曲线(图 1)。 图 1 接下来需要确定数据划分的边界类型,对于图 2 和图 3 中的两种数据分布, 显然图 2 需要一个线性的边界,而图 3 需要一个非线性的边界。接下来我们 只讨论线性边界的情况。 图 2 图 3 对于线性边界的情况,边界形式如下: 0 1 1 0 n T n n i i i x x x x           (2) 构造预测函数为: - 1( ) ( ) 1 T T xh x g x e    (3) (x)h 函数的值有特殊的含义,它表示结果取 1 的概率,因此对于输入 x 分 类结果为类别 1 和类别 0 的概率分别为: ( 1| ; ) ( ) ( 0 | ; ) 1- ( ) P y x h x P y x h x         (4) 3.2 构造 Cost 函数 Andrew Ng 在课程中直接给出了 Cost 函数及  J  函数如式(5)和(6),但 是并没有给出具体的解释,只是说明了这个函数来衡量 h 函数预测的好坏是合 理的。 (5) (6) 实际上这里的 Cost 函数和  J  函数是基于最大似然估计推导得到的。下面详 细说明推导的过程。(4)式综合起来可以写成: 1-( | ; ) ( ( )) (1- ( ))y yP y x h x h x   (7) 取似然函数为: (i) (i) (i) (i) 1 (i) (i) 1- 1 ( ) ( | ; ) ( ( )) (1- ( )) m i m y y i L P y x h x h x          (8) 对数似然函数为:   ( ) ( ) ( ) ( ) 1 ( ) log ( ) log ( ) 1- log(1- ( )) m i i i i i l L y h x y h x        (9) 最大似然估计就是要求得使 ( )l  取最大值时的 ,其实这里可以使用梯度上升 法求解,求得的 就是要求的最佳参数。但是,在 Andrew Ng 的课程中将 ( )J  取为(6)式,即: 1( ) - ( )J lm  (10) 因为乘了一个负的系数 1- m ,所以 ( )J  取最小值时的 为要求的最佳参数。 3.3 梯度下降法求 ( )J  的最小值 求 ( )J  的最小值可以使用梯度下降法,根据梯度下降法可得 的更新过程: : - ( ), ( 0 )j j j J j n       (11) 式中 为学习步长,下面来求偏导: ( ) (i) ( ) (i) (i) (i) 1 ( ) ( ) (i) (i) (i) 1 ( ) ( ) (i) (i) (i) 1 1 1( ) (x ) (1 ) (x )(x ) 1 (x ) 1 1 1(1 ) ( )( ) 1 ( ) 1 1 1(1 ) ( ) 1( ) 1 ( ) m i i ij j j m i i T T T i j i i T T T J y h y hm h h y y g xm g x g x y y g xm g x g x                                                         (i) (i) 1 ( ) (i) ( ) (i) (i) 1 (i) (i) 1 ( ) (i) (i) 1 (i) ( ) (i) 1 ( ) 1 1 ( ) (1 ) ( ) 1 ( ) 1 (x ) 1 (x ) m T T i j m i T i T j i m i T j i m i j i m i j i g x x y g x y g x xm y g x xm y h xm h y xm                                 (12) 上式求解过程中用到如下的公式:                  (x) (x) 2(x) (x) (x) (x) 1 1 1 1 1 1 1 1 g g g g g g f x e f x e g xx xe e g xe e x f x f x g xx             (13) 因此,(11)式的更新过程可以写成:  (i) ( ) (i) 1 1: - (x ) , ( 0 ) m i j j j i h y x j nm         (14) 因为式中 本来为一常量,所以一般将 1 m 省略,所以最终的 更新过程为:  (i) ( ) (i) 1 : - (x ) , ( 0 ) m i j j j i h y x j n        (15) 另外,补充一下,3.2 节中提到求得 ( )l  取最大值时的 也是一样的,用梯度上 升法求(9)式的最大值,可得:  ( ) (i) (i) 1 : ( ) ( 0 ) (x ) , j j j m i j j i j n y h x                 (16) 观察上式发现跟(14)是一样的,所以,采用梯度上升发和梯度下降法是完全 一样的,这也是《机器学习实战》中采用梯度上升法的原因。 3.4 梯度下降过程向量化 关于 更新过程的 vectorization,Andrew Ng 的课程中只是一带而过,没有具体 的讲解。 《机器学习实战》连 Cost 函数及求梯度等都没有说明,所以更不可能说明 vectorization 了。但是,其中给出的实现代码确是实现了 vectorization 的,图 4 所示代码的 32 行中 weights(也就是 )的更新只用了一行代码,直接通过矩 阵或者向量计算更新,没有用 for 循环,说明确实实现了 vectorization,具体代 码下一章分析。 文献[3]中也提到了 vectorization,但是也是比较粗略,很简单的给出 vectorization 的结果为:  (i) ( ) (i) 1 1: - (x ) , ( 0 ) m i i h y x j nm         (17) 且不论该更新公式正确与否,这里的   1 m i   是一个求和的过程,显然需要一个 for 语句循环 m 次,所以根本没有完全的实现 vectorization,不像《机器学习实 战》的代码中一条语句就可以完成 的更新。 下面说明一下我理解《机器学习实战》中代码实现的 vectorization 过程。 约定训练数据的矩阵形式如下, x 的每一行为一条训练样本,而每一列为不同 的特称取值: (1) (1) (1)(1) (1) 0 1 (2) (2) (2)(2) (2) 0 1 (m) (m) (m)(m) (m) 0 1 , n n n x x xx y x x xx yx y x x xx y                                        (18) 约定待求的参数 的矩阵形式为: 0 1 n                 (19) 先求 x A 并记为 A : (1) (1) (1) (1) (1) (1) 00 1 0 0 1 1 (2) (2) (2) (2) (2) (2) 10 1 0 0 1 1 (m) (m) (m) (m) (m) (m) 0 1 0 0 1 1 n n n n n n nn n n x x x x x x x x x x x xA x x x x x x x                                                     A A        (20) 求 (x)h y  并记为 E :         (1) (1) (1) (2) (2) (2) (m)(m) (m) (x) g A y e g A y eE h y g A y eg A y                             (21)  g A 的参数 A 为一列向量,所以实现 g 函数时要支持列向量作为参数,并返回 列向量。由上式可知 (x)h y  可以由  g A y 一次计算求得。 再来看一下(15)式的 更新过程,当 0j  时:     (i) ( ) (i) 0 0 0 1 (i) (i) 0 0 1 (1) (2) (m) 0 0 0 0 : - (x ) , , , m i i m i h y x e x x x x E                  A  A (22) 同样的可以写出 j ,  (1) (2) (m): , , ,j j j j jx x x E    A  A (23) 综合起来就是: (1) (2) (m) 0 0 0 0 0 (1) (2) (m) 1 1 1 1 1 (1) (2) (m) , , , , , ,: , , ,n n n n n T x x x x x x E x x x x E                                             A A   A A (24) 综上所述,vectorization 后 更新的步骤如下: (1) 求 A x  A ; (2) 求  E g A y  ; (3) 求 : Tx E    A A 。 4 代码分析 图 4 中是《机器学习实战》中给出的部分实现代码。 图 4 sigmoid 函数就是前文中的 (z)g 函数,参数 inX 可以是向量,因为程序中使用了 Python 的 numpy。 gradAscent 函数是梯度上升的实现函数,参数 dataMatin 和 classLabels 为训练数 据,23 和 24 行对训练数据做了处理,转换成 numpy 的矩阵类型,同时将横向 量的 classlabels 转换成列向量 labelMat,此时的 dataMatrix 和 labelMat 就是 (18)式中的 x 和 y 。alpha 为学习步长,maxCycles 为迭代次数。weights 为 n 维(等于 x 的列数)列向量,就是(19)式中的 。 29 行的 for 循环将更新 的过程迭代 maxCycles 次,每循环一次更新一次 。对 比 3.4 节最后总结的向量化的 更新步骤,30 行相当于求了 A x  A 和  g A , 31 行相当于求了  E g A y  ,32 行相当于求 : Tx E    A A 。所以这三行代 码实际上与向量化的 更新步骤是完全一致的。 总结一下,从上面代码分析可以看出,虽然只有十多行的代码,但是里面却隐 含了太多的细节,如果没有相关基础确实是非常难以理解的。相信完整的阅读 了本文,就应该没有问题了!^_^。 【参考文献】 [1] 《机器学习实战》——【美】Peter Harington [2] Stanford 机器学习公开课(https://www.coursera.org/course/ml) [3] http://blog.csdn.net/abcjennifer/article/details/7716281 [4] http://www.cnblogs.com/tornadomeet/p/3395593.html [5] http://blog.csdn.net/moodytong/article/details/9731283 [6] http://blog.csdn.net/jackie_zhu/article/details/8895270
还剩10页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

yudian

贡献于2014-10-29

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf