Logistic regression 的梯度下降解法-附python实现

Logistic regression是非常基础、传统和使用广泛的二分类方法。算法本身的优势略去不表,本文受Andrew NG的启发,旨在NN mindset的指导下,用梯度下降法实现逻辑回归求解。

1. 先来回顾下logistic regression的公式:

2.1 对单个样本(i),用loss function度量预测值(Yhat) 与真实值(y)的偏差

2.2 对整体,用平均的loss function代表该数据集的cost function

3.损失函数最小,求回归系数w。这步也就是J(w,b)对w求导,令导数为,求w。此时,据说无法求解析解(各位大神可以自行尝试并好心告知~),迭代法就出场了。

第3步常见的方法有:

1.梯度下降(以及优化的随机梯度下降和mini batch梯度下降,这个以后另写一篇说明)

2.牛顿迭代

3.拟牛顿迭代算法(BFGS算法和L-BFGS算法)

为什么说是NN mindset的梯度下降法呢,看下图:

forward计算,backward导数求解,再迭代更新,此为精华

梯度求解的伪代码如下:

初始化回归系数

重复以下步骤直至停止条件{

算 dw, db

用 alpha和gradient更新回归系数w,b

}

此处是最简单的梯度下降,需要遍历整个数据集,更新一轮w,b,当样本量和特征数很大时,这无疑是费时的。

随机梯度下降(stochastic gradient descent)对此进行了优化,用一个样本点来更新一轮w,b,但是会出现 cost function忽大忽小的随机情况。再改进,就比如mini batch,用一小批样本更新一轮,比随机更稳健一些。

这里还涉及到一个迭代停止条件,可以从几方面考虑,如cost function降低幅度,迭代次数。当然,alpha的大小也决定了损失函数降低的幅度。

另外一点需要注意的是,用alpha * dw更新每个w时,对不同量纲的x采用相同的alpha,可能会造成收敛速度较慢或cost function无法达到全局最优。

以下就是具体的python实现~

本文用python自带的iris数据集测试

参数初始化,同时保留几个列表,存储每次迭代的结果

主程序开始啦!

6万多次停止了。效果如下:

本着严谨审慎的态度,用python自带的包算了下逻辑回归参数,如下:

这里python包用的是statsmodels.api里的GLM(families.Binomial),跟梯度方法相差不多(这里alpha和迭代次数还是调了会儿的,可以试试标准化x有什么差别)。

另,如果用LogisticModel包,因为自带正则项惩罚,参数结果会不太一样。

这是后话。回看这个梯度迭代法实现起来并不难,但一开始说要写,宝宝内心是抗拒的啊泥胃,这句话送给自己:everything will be fine 加油!

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180425G1Y1JQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券