机器学习实战ByMatlab(五)Logistic Regression

什么叫做回归呢?举个例子,我们现在有一些数据点,然后我们打算用一条直线来对这些点进行拟合(该曲线称为最佳拟合曲线),这个拟合过程就被称为回归。

利用Logistic回归进行分类的主要思想是:

根据现有数据对分类边界线建立回归公式,以此进行分类。

这里的”回归“一词源于最佳拟合,表示要找到最佳拟合参数集。训练分类器时的嘴阀就是寻找最佳拟合曲线,使用的是最优化算法。

基于Logistic回归和Sigmoid函数的分类

优点:计算代价不高,易于理解和实现 缺点:容易欠拟合,分类精度可能不高

使用数据类型:数值型和标称型数据

Sigmoid函数:

波形如下:

当z为0时,值为0.5,当z增大时,g(z)逼近1,当z减小时,g(z)逼近0

Logistic回归分类器:

对每一个特征都乘以一个回归系数,然后把所有结果都相加,再讲这个总和代入Sigmoid函数中,从而得到一个范围在0-1之间的数值。任何大于0.5的数据被分为1,小于0.5的数据被分为0.因此Logistic回归也被看成是一种概率分布。

分类器的函数形式确定之后,现在的问题就是,如何确定回归系数?

基于最优化方法的最佳回归系数确定

Sigmoid函数的输入记为z,由下面公式得出:

如果采用向量的写法,则上述公式可以写成:

其中向量X就是分类器的输入数据,向量W也就是我们要找到的最佳参数,从而使分类器尽可能更加地精确。接下来将介绍几种需找最佳参数的方法。

梯度上升法

梯度上升法的基本思想:

要找到某函数的最大值,最好的方法是沿着该函数的梯度方向寻找

这里提一下梯度下降法,这个我们应该会更加熟悉,因为我们在很多代价函数J的优化的时候经常用到它,其基本思想是:

要找到某函数的最小值,最好的方法是沿着该函数的梯度方向的反方向寻找

函数的梯度表示方法如下:

移动方向确定了,移动的大小我们称之为步长,用α表示,用向量来表示的话,梯度下降算法的迭代公式如下:

该公式已知被迭代执行,直到某个停止条件位置,比如迭代次数达到某个指定值或者算法的误差小到某个允许的误差范围内。

注:梯度下降算法中的迭代公式如下:

Matlab 实现clcclose allclear%%data = load(‘testSet.txt’);[row , col] = size(data);dataMat = data(:,1:col-1);dataMat = [ones(row,1) dataMat] ;labelMat = data(:,col);alpha = 0.001;maxCycle = 500;weight = ones(col,1);for i = 1:maxCycleh = sigmoid((dataMat * weight)’);error = (labelMat – h’);weight = weight + alpha * dataMat’ * error;endfigurescatter(dataMat(find(labelMat(:) == 0),2),dataMat(find(labelMat(:) == 0),3),3);hold onscatter(dataMat(find(labelMat(:) == 1),2),dataMat(find(labelMat(:) == 1),3),5);hold onx = -3:0.1:3;y = (-weight(1)-weight(2)*x)/weight(3);plot(x,y)hold off= returnVals = 1.0./(1.0+exp(-inX));end效图如下:

由上图可以看到,回归效果还是挺不错的,只有2-4个点分类错误。

其实这是的梯度上升算法是批量梯度上升算法,每一次更新参数的时候都要讲所有的数据集都代入训练,效果并不好,下面我们将介绍改进版本:随机梯度上升算法

随机梯度上升

梯度上升算法在每次更新回归系数时都要遍历整个数据集,该方法在处理100个左右的数据集时尚可,但如果有数十亿样本和成千上万的特征,那么该方法的复杂度就太高了。一种改进方法是一次仅用一个样本点来更新回归系数,该方法就称为随机梯度上升法。由于可以在新样本到来之前对分类器进行增量式更新,因此随机梯度算法是一个在线学习算法。与”在线学习“相对应,一次处理所有数据被称作是”批处理“

随机梯度上升算法可以写成如下的伪代码:

所有回归系数初始化为1对数据集中的每个样本计算该样本的梯度使用alpha x gradient 更新回归系数值返回回归系数值Matlab 代码实现clcclear close all%%data = load(‘testSet.txt’);[row , col] = size(data);dataMat = [ones(row,1) data(:,1:col-1)];alpha = 0.01;labelMat = data(:,col);weight = ones(col,1);for i = 1:rowh = sigmoid(dataMat(i,:)*weight);error = labelMat(i) – h;dataMat(i,:)weightweight = weight + alpha * error * dataMat(i,:)’endfigurescatter(dataMat(find(labelMat(:)==0),2),dataMat(find(labelMat(:)==0),3),5);hold onscatter(dataMat(find(labelMat(:) == 1),2),dataMat(find(labelMat(:) == 1),3),5);hold onx = -3:0.1:3;y = -(weight(1)+weight(2)*x)/weight(3);plot(x,y)hold offendfunction returnVals = sigmoid(inX)% 注意这里的sigmoid函数要用点除returnVals = 1.0./(1.0+exp(-inX));end效果如下:

由上图可以看出,随机梯度上升算法分类效果并没有上面的的梯度上升算法分类效果好。

年轻是我们唯一拥有权利去编织梦想的时光

机器学习实战ByMatlab(五)Logistic Regression

相关文章:

你感兴趣的文章:

标签云: