Matlab实现Logistic Regression_第1页
Matlab实现Logistic Regression_第2页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、岸SBO-IrbMosviss、asmEBSEssoiessiw、ssfeBT.'m回,sso«s、回心®毬K盘隸<R友粵檢皿屠粵摩-回21S一6。旺屁。®回只肄穆紜SBH如菸«、(assiau.2ssa!6WNUPSBO-I当z为0时,值为0.5,当z增大时,g(z)逼近1,当z减小时,g(z)逼近0Logistic回归分类器:对每一个特征都乘以一个回归系数,然后把所有结果都相加,再讲这个总和代入Sigmoid函数中,从而得到一个范围在0-1之间的数值。任何大于0.5的数据被分为1,小于0.5的数据被分为0因此Logistic回归也被看成

2、是一种概率分布。分类器的函数形式确定之后,现在的问题就是,如何确定回归系数?基于最优化方法的最佳回归系数确定Sigmoid函数的输入记为z,由下面公式得出:z=woxo+w2x2+.+wnxn如果采用向量的写法,则上述公式可以写成:7=WTY其中向量x就是分类器的输入数据,向量w也就是我们要找到的最佳参数,从而使分类器尽可能更加地精确。接下来将介绍几种需找最佳参数的方法。梯度上升法梯度上升法的基本思想:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向寻找这里提一下梯度下降法,这个我们应该会更加熟悉,因为我们在很多代价函数j的优化的时候经常用到它,其基本思想是:要找到某函数的最小值,最好的

3、方法是沿着该函数的梯度方向的反方向寻找函数的梯度表示方法如下:这个梯度煮味着酬着讷方向移动塑,沿着亦方向移动如移动方向确定了,移动的大小我们称之为步长,用a表示,用向量来表示的话,梯度下降算法的迭代公式如下:w:=w+qVw/(w)该公式已知被迭代执行,直到某个停止条件位置,比如迭代次数达到某个指定值或者算法的误差小到某个允许的误差范围内。注:梯度下降算法中的迭代公式如下:w:=waVw/(w)Matlab实现functionweight=gradAscent%clccloseallclear%data=load('testSet.txt');row,col=size(data

4、);dataMat=data(:,1:col-1);dataMat=ones(row,1)dataMat;labelMat=data(:,col);alpha=0.001;maxCycle=500;weight=ones(col,1);fori=1:maxCycleh=sigmoid(dataMat*weight)');error=(labelMat一h');weight=weight+alpha*dataMat'*error;endfigurescatter(dataMat(find(labelMat(:)=0),2)JdataMat(find(labelMat(:)

5、=0),3),3);holdonscatter(dataMat(find(labelMat(:)=1),2),dataMat(find(labelMat(:)=1),3),5);holdonX=-3:0.1:3;y=(-weight(1)-weight(2)*X)/weight(3);plot(x,y)holdoffendfunctionreturnVals=sigmoid(inX)%注意这里的sigmoid函数要用点除returnVals=1.0./(1.0+exp(-inX);end效图如下:由上图可以看到,回归效果还是挺不错的,只有2-4个点分类错误。其实这是的梯度上升算法是批梯度上升算

6、法,每一次更新参数的时候都要讲所有的数据集都代入训练,效果并不好,下面我们将介绍改进版本:随机梯度上升算法随机梯度上升梯度上升算法在每次更新回归系数时都要遍历整个数据集,该方法在处理100个左右的数据集时尚可,但如果有数十亿样本和成千上万的特征,那么该方法的复杂度就太高了。一种改进方法是一次仅用一个样本点来更新回归系数,该方法就称为随机梯度上升法。由于可以在新样本到来之前对分类器进行增量式更新,因此随机梯度算法是一个在线学习算法。与”在线学习“相对应,一次处理所有数据被称作是”批处理“随机梯度上升算法可以写成如下的伪代码:所有回归系数初始化为1对数据集中的每个样本计算该样本的梯度使用alpha

7、xgradient更新回归系数值返回回归系数值Matlab代码实现functionstocGradAscent%Description:LogisticRegressionusingstocGradAsscent%Author:Liulongpo%Time:2015-4-1810:57:25%clcclearcloseall%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

8、);fori=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);holdonscatter(dataMat(find(labelMat(:)=1),2)JdataMat(find(labelMat(:)=1),3),5);holdonX=-3:0.1:

9、3;y=-(weight(1)+weight(2)*x)/weight(3);plot(x,y)holdoffendfunctionreturnVals=sigmoid(inX)%注意这里的sigmoid函数要用点除returnVals=1.0./(1.0+exp(-inX);end效果如下:由上图可以看出,随机梯度上升算法分类效果并没有上面的的梯度上升算法分类效果好。但是直接比较梯度上升算法和随机梯度上升算法是不公平的,前者是在整个数据集上迭代500次得到的结果,后者只是迭代了100次。一个判断算法优劣的可靠方法是看它是否收敛,也就是说求解的参数是否达到了稳定值,是否还会不断变化。我们让随机

10、梯度上升算法在整个数据集上运行200次,迭代过程中3个参数的变化如下图:由上图可以看到,weightl最先达到稳定,而weight。和weight2则还需要更多的迭代次数来达到稳定。此时的分类器跟之前的梯度上升算法的分类效果差不多,如下:但同时我们也可以看到,三个参数都有不同程度的波动。产生这种现象的原因是存在一些不能被正确分类的样本点(数据集并非线性可分),在每次迭代的时候都会引起参数的剧烈变化。我们期望算法能避免来回波动,从而收敛到某个值。另外,算法收敛速度也要加快。改进的随机梯度上升算法改进的随机梯度上升算法的主要两个改进点如下:1,每一步调整alpha的值,也就是alpha的值是不严格

11、下降的2随机采取样本来更新回归参数matlab代码如下:functionImproveStocGradAscent%Description:LogisticRegressionusingstocGradAsscent%Author:Liulongpo%Time:2015-4-1810:57:25%clcclearcloseall%data=load('testSet.txt');row,col=size(data);dataMat=ones(row,1)data(:,1:col-1);%alpha=0.01;numIter=20;labelMat=data(:,col);wei

12、ghtVal=zeros(3,numIter*row);weight=ones(col,1);j=0;fork=1:numIterrandIndex=randperm(row);fori=1:row%改进点1alpha=4/(1.0+i+k)+0.01;j=j+1;%改进点2h=sigmoid(dataMat(randIndex(i),:)*weight);%改进点2error=labelMat(randIndex(i)一h;%改进点2weight=weight+alpha*error*dataMat(randIndex(i),:)'weightVal(1j)=weight(1);we

13、ightVal(2j)=weight(2);weightVal(3j)=weight(3);endendfigurei=1:numIter*row;subplot(3,1,1)plot(i,weightVal(1,:),title('weight0')%,axis(0numIter*row0.87)j=1:numIter*row;subplot(3,1,2)plot(j,weightVal(2,:),title('weight1')%,axis(0numIter*row0.31.2)k=1:numIter*row;subplot(3,1,3)plot(k,wei

14、ghtVal(3,:),title('weight2')%,axis(0numIter*row-1.2-0.1)figurescatter(dataMat(find(labelMat(:)=0),2),dataMat(find(labelMat(:)=0),3),5);holdonscatter(dataMat(find(labelMat(:)=1),2),dataMat(find(labelMat(:)=1),3),5);holdonX=-3:0.1:3;y=-(weight(1)+weight(2)*X)/weight(3);plot(x,y,'rl)holdoff

15、endfunctionreturnVals=sigmoid(inX)%注意这里的sigmoid函数要用点除returnVals=1.0./(1.0+exp(-inX);end改进点1中的alpha会随着迭代次数的增加不断减小,旦由于代码中常数0.01的存在,alpha不会减少到0。这样做是为了保证在多次迭代之后新数据对于参数的更新还有一定的影响。另一点值得注意的就是,alpha每次减少1/(k+i),k是迭代次数,i是样本的下标。所以alpha不是严格下降的。避免参数的严格下降也常见于模拟退火算法等其他优化算法中。第二个改进的地方如代码注释中标记的,这里通过随机采取样本来更新回归参数,这样能够

16、减少参数的周期性的波动。由于alpha的动态变化,我们可以在开始的时候设置比较大的值,代码中设置0.01,alpha也就是每一次迭代的步长,步长越大,越能够加快参数的收敛速度。然后ahpha会不严格下降,这样就避免了过拟合现象的发生。至于什么是过拟合已经alpha的选取问题将在下面描述。迭代20次后效果如下:由上图可知,步长alpha动态变化之后,参数的收敛速度加快了很多,这里只是对所有样本数据集迭代20次,weight。和weight2很早就收敛。证明了该算法的优异性。学习率alpha的选取首先我们看一下梯度上升算法的核心代码,如下:h=sigmoid(dataMat(i,:)*weight

17、);error=labelMat(i)一h;weight=weight+alpha*error*dataMat(i,:)'第一行做的就是估计分类,第二行计算当前估计与正确分类之间的差error,第三行根据这个error来更新参数weight。我们在迭代的时候,要做的目标就是最小化error,我们令J代表error,令向量0代表weight,则很显然,J是0的函数。这里盗用Standfor机器学习教程的图,如下:上图中的每个箭头就是每一次迭代的更新步长,第一幅图我们看到,在最小化J(0)的时候迭代了很多次,这说明什么?说明我们要走很多步才能到达全局最优点,原因就是我们每一步走的距离太短,走得太慢,也就是我们的alpha设置得太小。但是当我们处于最优点附近的时候

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论