Logistic回归和梯度上升算法

来源:互联网 发布:linux 压缩命令 tar 编辑:程序博客网 时间:2024/06/06 04:57

Logistic回归和梯度上升算法


《机器学习实战》中有一个简单的例子用于练习Logistic回归。但是教材中仅仅给了代码,而略去了数学推导。那么如果直接应用这个代码再加上一些设置迭代次数,根据过程动态调整步长的技巧,就可以比较好地完成任务的。对应还附赠了一个horseColic的数据供练习,这个数据挺不错。


下面给出代码和说明:

import numpy as npdef sigmoid(X):    return 1 / (1 + np.exp(-X))def gradAscent(dataMat, classLabels):    dataMatrix = np.mat(dataMat)    labelMat = np.mat(classLabels).transpose()    m, n = np.shape(dataMatrix)    alpha = 0.001    maxCycles = 500    weights = np.ones((n, 1))    for k in range(maxCycles):        h = sigmoid(np.dot(dataMatrix, weights))        error = labelMat - h        weights = weights + alpha * np.dot(dataMatrix.transpose(), error)    return weights

结果利用书中的绘图引擎绘制图像如下,可以看出效果还是不错的。

这里写图片描述


下面分析算法。
算法核心为一个定义的sigmoid函数,并且回归基于一个迭代式
sigmoid(x)=11+ex,对于一个矩阵,sigmoid([aij])=[sigmoid(aij)]
迭代式为w(k+1)=w(k)+αxT(ysigmoid(xw))
w(k+1)=w(k)+αwf(w)形式的迭代式就是是梯度上升算法,但是没有说清楚的是,f(w)到底是什么,为什么代码里取那一个表达式。下面讲一讲我粗浅的理解。(限于数学水平,很多地方我都没有办法一一推导,也觉得这样没有必要)


首先sigmoid(x)的选用是有讲究的在logistic回归时采用的是伯努利分布,而概率统计课程中我们应该可以隐约发现伯努利分布,泊松分布,贝塔分布等分布与指数分布都有千丝万缕的联系,比如观测大量指数分布寿命的放射性元素衰变数量服从泊松分布,而贝塔分布又可以退化为这两个分布,等等。
这是由一套理论作支持的,这个理论便是一般线性模型。上述这些概率分布都可以称作是指数分布。而指数分布的对数发生比logp1p=x所以我们可以定义出sigmoid(x),当然其中略去了大段数学推导,只挑着我觉得很显然很关键的部分讲了一下。如果注意一下高中生物的Logistic增长曲线,会发现它们的微分方程和对对数发生比以及对数环境容纳率比定义几乎一样,难怪都叫Logistic,很有可能这是一类微分方程或一种手法的命名。


然后考虑求解什么函数的最值呢?事实上是一个似然函数/对数似然函数的最值,然后用牛顿迭法求解构成驻点的值,所以迭代式与牛顿迭代法如此相似,因为原理就是基于牛顿迭代法的。
也就是说Logistic回归的本质是log(p1p)=wTx条件下,根据观测点求w的最大似然估计。
我们与线性回归对比一下,线性回归是y=wTx条件下,根据观测点求w的最大似然估计(注意二乘估计也没有错,我在概率统计课程中求解过结果是一样的)。
Logistic回归把指数分布的概率做变换变为对数发生比,再用线性回归求解估计,这就是我的理解。

0 0