numpy机器学习 – 逻辑回归分类

本文介绍如何推导与手写一个逻辑回归分类模型,涉及到数学推导没法事无巨细,所以下面只是一个大概的流程记录。

理论简述

前文讲到”感知机分类器“,因为是w向量与x向量的乘法,具备图形上的分割意义,但是当它遇到这样的数据分布时:

这属于典型的直线无法分隔的2分类问题,我们把它叫做”线性不可分“,这时候我们需要对输入x做二次项才能产生曲线分割。

但是感知机的分界线是w向量垂直的直线,这个直线是无法带拐弯的,所以感知机无法搞定线性不可分问题。

此时我们开始介绍可以解决这种线性不可分问题的逻辑回归分类器,其实原理也很简单。

首先我们做一个线性回归的函数f(x)出来,稍后我们要学习的就是这里的一组theta参数:

为了产生曲线分界线,我们可以做出x的一些二次项、三次项,这个函数曲线就具备了非线性图形。

但是这个函数是个回归函数,输出的y是无限的,但我们现在面临的是分类问题,怎么办呢?

那就把上面的回归函数套到一个叫做sigmoid的函数里作为参数(复合函数/嵌套函数):

而sigmoid的输出图形是这样的:

横坐标是回归方程,纵坐标的范围是0~1之间的,我们把这个sigmoid函数就叫做”逻辑回归分类器”,其含义是:

当输入x时,输出的y是分类为正类的概率,我们在样本中把正类视为1,负类视为0,当输出>=0.5时候就是分类1,否则是分类0。

进一步从图形上观察:

我们发现分类为1还是0其实直接与横坐标有关,而横坐标就是回归函数的取值:

我们可以任意带入一组随机的theta值到回归函数中:

计算这个不等格式:

也就是说x2>=-2×1+100的时候,分类为1。

用x1作为横坐标,计算出对应的x2,画出这个回归函数的曲线:

虚线之上就是不等式成立的区域,也就是点被分类为1的范围。

同理虚线之下就是点被分类为0的范围:

虚线或者说回归函数自身就是分类边界线,而带入到sigmoid产生的逻辑回归分类器,其输出的含义也正是预测y=1的概率:

那么优化的目标函数是什么呢?当然是输入样本x时预测的分类要尽量的正确。

我们把逻辑回归函数用数学符号定义,如前所述就是表示输入x时预测为正类的概率:

我们的优化目标是这样的:

那么综合所有样本来说,就是希望这样一个优化目标:

对于每个样本x预测为样本y的概率是最大的,把所有样本预测正确的概率乘起来应该向更大的方向优化,这个目标函数叫做“似然函数”,就是我们要优化的目标,优化的方式就是调整theta系数。

注意:

逻辑回归表达的是预测为正类的概率,但是上述公式中存在预测为负类的概率,这个不必担心,因为1-P(正类|x)就是P(负类|x),是可以互相转换的。

上述目标函数的每一项受到对应样本y的取值的影响,需要用数学进一步符号化表达:

当样本y=1时第二项相当于没有,当样本y=0时第一项相当于没有,所以这个表达是通用的。

对“似然函数”求各个theta系数的偏导比较麻烦,因为这是乘法公式,所以我们只需要对这个函数取log,就可以转换成加法形式而且不影响优化目标:

化简过程如下:

这里面主要依赖log(ab) = log(a)+log(b),所以将乘法转换成了加法,具体用到了这些数学变换理论:

上述目标函数就是我们最终要求偏导的“对数似然函数”了,里面的theta是未知数,其他都是来自样本的x,y,我们想办法让横坐标theta朝着让这个“对数似然函数”取值更大的方向前进即可,仍旧是用梯度下降法,只不过这里准确应该叫做“梯度上升法”。

具体求偏导过程就不解释了,最终关于theta_j的更新公式就是在现有基础上+一个微小的梯度变化:

注意逻辑回归是否能够对“线性不可分”的数据进行分类并不是逻辑回归自身带来的能力,而是我们需要让回归函数的输入x带有二次项或者以上,才能产生如下的分界线:

例如这样的回归函数带入sigmoid就可以得到上面的分类界线:

代码开发

首先读入数据:

数据集包含x1,x2和y:

对x1和x2分别作了标准化。

我们对回归函数部分做了x1的二次项,这样分界线才能实现非线性。

训练过程就是根据推导出的theta更新公式,不停的调整theta系数,训练一定的轮数停止。

训练是采用随机梯度+minibatch的方式,并且每一轮都对训练集进行预测计算了一下模型的准确率。

最后,我们绘制出分界线(也就是回归函数),将x1作为横坐标带入回归函数,求出x2作为纵坐标,绘制出的图形是弯曲的,并且成功分隔了2类数据点。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~