博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression
阅读量:4561 次
发布时间:2019-06-08

本文共 7062 字,大约阅读时间需要 23 分钟。

原文:http://blog.csdn.net/abcjennifer/article/details/7732417

 

本文为Maching Learning 栏目补充内容,为上几章中所提到 、 和  的总结版。旨在帮助大家更好地理解回归,所以我在Matlab中分别对他们予以实现,在本文中由易到难地逐个介绍。
 
 

本讲内容:

Matlab 实现各种回归函数

=========================

 

基本模型

 

Y=θ0+θ1X1型---线性回归(直线拟合)

解决过拟合问题---Regularization

 

Y=1/(1+e^X)型---逻辑回归(sigmod 函数拟合)

=========================

 

 
第一部分:基本模型

 

 

在解决拟合问题的解决之前,我们首先回忆一下线性回归和逻辑回归的基本模型。

 

设待拟合参数 θn*1 和输入参数[ xm*n, ym*1 ] 。

 

对于各类拟合我们都要根据梯度下降的算法,给出两部分:

①   cost function(指出真实值y与拟合值h<hypothesis>之间的距离):给出cost function 的表达式,每次迭代保证cost function的量减小;给出梯度gradient,即cost function对每一个参数θ的求导结果。

function [ jVal,gradient ] = costFunction ( theta )

 

②   Gradient_descent(主函数):用来运行梯度下降算法,调用上面的cost function进行不断迭代,直到最大迭代次数达到给定标准或者cost function返回值不再减小。

function [optTheta,functionVal,exitFlag]=Gradient_descent( )

 

线性回归:拟合方程为hθ(x)=θ0x01x1+…+θnxn,当然也可以有xn的幂次方作为线性回归项(如),这与普通意义上的线性不同,而是类似多项式的概念。

其cost function 为:

 

逻辑回归:拟合方程为hθ(x)=1/(1+e^(θTx)),其cost function 为:

 

cost function对各θj的求导请自行求取,看最后一图,或者参见后文代码。

 

后面,我们分别对几个模型方程进行拟合,给出代码,并用matlab中的fit函数进行验证。

 

 

 

第二部分:
Y=θ0+θ1X1型---线性回归(直线拟合)
 

在中我们已经讲过如何用matlab自带函数fit进行直线和曲线的拟合,非常实用。而这里我们是进行ML课程的学习,因此研究如何利用前面讲到的梯度下降法(gradient descent)进行拟合。

 

cost function:
1 function [ jVal,gradient ] = costFunction2( theta ) 2 %COSTFUNCTION2 Summary of this function goes here 3 %   linear regression -> y=theta0 + theta1*x 4 %   parameter: x:m*n  theta:n*1   y:m*1   (m=4,n=1) 5 %    6  7 %Data 8 x=[1;2;3;4]; 9 y=[1.1;2.2;2.7;3.8];10 m=size(x,1);11 12 hypothesis = h_func(x,theta);13 delta = hypothesis - y;14 jVal=sum(delta.^2);15 16 gradient(1)=sum(delta)/m;17 gradient(2)=sum(delta.*x)/m;18 19 end

其中,h_func是hypothesis的结果:

1 function [res] = h_func(inputx,theta)2 %H_FUNC Summary of this function goes here3 %   Detailed explanation goes here4 5 6 %cost function 27 res= theta(1)+theta(2)*inputx;function [res] = h_func(inputx,theta)8 end

Gradient_descent:

1 function [optTheta,functionVal,exitFlag]=Gradient_descent( )2 %GRADIENT_DESCENT Summary of this function goes here3 %   Detailed explanation goes here4 5   options = optimset('GradObj','on','MaxIter',100);6   initialTheta = zeros(2,1);7   [optTheta,functionVal,exitFlag] = fminunc(@costFunction2,initialTheta,options);8 9 end

result:

1 >> [optTheta,functionVal,exitFlag] = Gradient_descent() 2  3 Local minimum found. 4  5 Optimization completed because the size of the gradient is less than 6 the default value of the function tolerance. 7  8 
9 10 11 optTheta =12 13 0.300014 0.860015 16 17 functionVal =18 19 0.072020 21 22 exitFlag =23 24 1
即得y=0.3+0.86x;
验证:
1 function [ parameter ] = checkcostfunc(  ) 2 %CHECKC2 Summary of this function goes here 3 %   check if the cost function works well 4 %   check with the matlab fit function as standard 5  6 %check cost function 2 7 x=[1;2;3;4]; 8 y=[1.1;2.2;2.7;3.8]; 9 10 EXPR= {
'x','1'};11 p=fittype(EXPR);12 parameter=fit(x,y,p);13 14 end

运行结果:

1 >> checkcostfunc()2 3 ans = 4 5      Linear model:6      ans(x) = a*x + b7      Coefficients (with 95% confidence bounds):8        a =        0.86  (0.4949, 1.225)9        b =         0.3  (-0.6998, 1.3)

和我们的结果一样。下面画图:

1 function PlotFunc( xstart,xend ) 2 %PLOTFUNC Summary of this function goes here 3 %   draw original data and the fitted  4  5  6  7 %===================cost function 2====linear regression 8 %original data 9 x1=[1;2;3;4];10 y1=[1.1;2.2;2.7;3.8];11 %plot(x1,y1,'ro-','MarkerSize',10);12 plot(x1,y1,'rx','MarkerSize',10);13 hold on;14 15 %fitted line - 拟合曲线16 x_co=xstart:0.1:xend;17 y_co=0.3+0.86*x_co;18 %plot(x_co,y_co,'g');19 plot(x_co,y_co);20 21 hold off;22 end
 
 
第三部分:
解决过拟合问题---Regularization
 
过拟合问题解决方法我们已在第三章中讲过,利用Regularization的方法就是在cost function中加入关于θ的项,使得部分θ的值偏小,从而达到fit效果。
例如定义costfunction J(θ): jVal=(theta(1)-5)^2+(theta(2)-5)^2;

在每次迭代中,按照gradient descent的方法更新参数θ:θ(i)-=gradient(i),其中gradient(i)是J(θ)对θi求导的函数式,在此例中就有gradient(1)=2*(theta(1)-5), gradient(2)=2*(theta(2)-5)。

 

函数costFunction, 定义jVal=J(θ)和对两个θ的gradient:

1 function [ jVal,gradient ] = costFunction( theta ) 2 %COSTFUNCTION Summary of this function goes here 3 %   Detailed explanation goes here 4  5 jVal= (theta(1)-5)^2+(theta(2)-5)^2; 6  7 gradient = zeros(2,1); 8 %code to compute derivative to theta 9 gradient(1) = 2 * (theta(1)-5);10 gradient(2) = 2 * (theta(2)-5);11 12 end

Gradient_descent,进行参数优化

1 function [optTheta,functionVal,exitFlag]=Gradient_descent( )2 %GRADIENT_DESCENT Summary of this function goes here3 %   Detailed explanation goes here4 5  options = optimset('GradObj','on','MaxIter',100);6  initialTheta = zeros(2,1)7  [optTheta,functionVal,exitFlag] = fminunc(@costFunction,initialTheta,options);8   9 end

matlab主窗口中调用,得到优化厚的参数(θ1,θ2)=(5,5)

1  [optTheta,functionVal,exitFlag] = Gradient_descent() 2  3 initialTheta = 4  5      0 6      0 7  8  9 Local minimum found.10 11 Optimization completed because the size of the gradient is less than12 the default value of the function tolerance.13 14 
15 16 17 optTheta =18 19 520 521 22 23 functionVal =24 25 026 27 28 exitFlag =29 30 1

第四部分:Y=1/(1+e^X)型---逻辑回归(sigmod 函数拟合)

 hypothesis function:

1 function [res] = h_func(inputx,theta)2 3 %cost function 34 tmp=theta(1)+theta(2)*inputx;%m*15 res=1./(1+exp(-tmp));%m*16 7 end

cost function:

1 function [ jVal,gradient ] = costFunction3( theta ) 2 %COSTFUNCTION3 Summary of this function goes here 3 %   Logistic Regression 4  5 x=[-3;      -2;     -1;     0;      1;      2;     3]; 6 y=[0.01;    0.05;   0.3;    0.45;   0.8;    1.1;    0.99]; 7 m=size(x,1); 8  9 %hypothesis  data10 hypothesis = h_func(x,theta);11 12 %jVal-cost function  &  gradient updating13 jVal=-sum(log(hypothesis+0.01).*y + (1-y).*log(1-hypothesis+0.01))/m;14 gradient(1)=sum(hypothesis-y)/m;   %reflect to theta115 gradient(2)=sum((hypothesis-y).*x)/m;    %reflect to theta 216 17 end

Gradient_descent:

1 function [optTheta,functionVal,exitFlag]=Gradient_descent( )2 3  options = optimset('GradObj','on','MaxIter',100);4  initialTheta = [0;0];5  [optTheta,functionVal,exitFlag] = fminunc(@costFunction3,initialTheta,options);6 7 end

运行结果:

1  [optTheta,functionVal,exitFlag] = Gradient_descent() 2  3 Local minimum found. 4  5 Optimization completed because the size of the gradient is less than 6 the default value of the function tolerance. 7  8 
9 10 11 optTheta =12 13 0.352614 1.757315 16 17 functionVal =18 19 0.249820 21 22 exitFlag =23 24 1

 

 
画图验证:
 
1 function PlotFunc( xstart,xend ) 2 %PLOTFUNC Summary of this function goes here 3 %   draw original data and the fitted  4  5 %===================cost function 3=====logistic regression 6  7 %original data 8 x=[-3;      -2;     -1;     0;      1;      2;     3]; 9 y=[0.01;    0.05;   0.3;    0.45;   0.8;    1.1;    0.99];10 plot(x,y,'rx','MarkerSize',10);11 hold on12 13 %fitted line14 x_co=xstart:0.1:xend;15 theta = [0.3526,1.7573];16 y_co=h_func(x_co,theta);17 plot(x_co,y_co);18 hold off19 20 end

 

 
 
有朋友问,这里就补充一下logistic regression中gradient的推导:
则有
由于cost function
可得
所以gradient = -J'(theta) = (z-y)x

 

 

 

 

转载于:https://www.cnblogs.com/nsnow/p/5046774.html

你可能感兴趣的文章
经常使用的android弹出对话框
查看>>
确保新站自身站点设计的合理性的六大注意点
查看>>
1033. 旧键盘打字(20)
查看>>
The Zen of Python
查看>>
git安装及使用
查看>>
mysql一个非常实用解决sql查询优化的函数explain
查看>>
图文讲解NTFS和FAT32硬盘下 asp.net 生成word 错误: 80070005 和 错误:8000401a 的解决方法...
查看>>
《学习》5连接查询(高级查询)
查看>>
python日常—爬取豆瓣250条电影记录
查看>>
11.3NOIP模拟赛
查看>>
1.SDL介绍
查看>>
【重要更新】语言转换类编程工具Tangible系列本月又更新了!
查看>>
现场赛:开关灯问题
查看>>
codeforces A. Jeff and Rounding (数学公式+贪心)
查看>>
zoj 3462
查看>>
java多线程-信号量
查看>>
如何在Delphi XE2中使用Dynamic Web TWAIN
查看>>
js自定义实用函数总结
查看>>
java内存区域与内存溢出异常
查看>>
点点滴滴的成长[2011-11-1]:理解C#修饰符
查看>>