zoukankan      html  css  js  c++  java
  • Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression

    原文: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 线性拟合 & 非线性拟合中我们已经讲过如何用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 here
    3 %   Detailed explanation goes here
    4 
    5 
    6 %cost function 2
    7 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 here
    3 %   Detailed explanation goes here
    4 
    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 <stopping criteria details>
     9 
    10 
    11 optTheta =
    12 
    13     0.3000
    14     0.8600
    15 
    16 
    17 functionVal =
    18 
    19     0.0720
    20 
    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 + b
    7      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 here
    3 %   Detailed explanation goes here
    4 
    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 than
    12 the default value of the function tolerance.
    13 
    14 <stopping criteria details>
    15 
    16 
    17 optTheta =
    18 
    19      5
    20      5
    21 
    22 
    23 functionVal =
    24 
    25      0
    26 
    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 3
    4 tmp=theta(1)+theta(2)*inputx;%m*1
    5 res=1./(1+exp(-tmp));%m*1
    6 
    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  data
    10 hypothesis = h_func(x,theta);
    11 
    12 %jVal-cost function  &  gradient updating
    13 jVal=-sum(log(hypothesis+0.01).*y + (1-y).*log(1-hypothesis+0.01))/m;
    14 gradient(1)=sum(hypothesis-y)/m;   %reflect to theta1
    15 gradient(2)=sum((hypothesis-y).*x)/m;    %reflect to theta 2
    16 
    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 <stopping criteria details>
     9 
    10 
    11 optTheta =
    12 
    13     0.3526
    14     1.7573
    15 
    16 
    17 functionVal =
    18 
    19     0.2498
    20 
    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 on
    12 
    13 %fitted line
    14 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 off
    19 
    20 end
     
     
    有朋友问,这里就补充一下logistic regression中gradient的推导:
    则有
    由于cost function
    可得
    所以gradient = -J'(theta) = (z-y)x
  • 相关阅读:
    ARP 协议
    3GPP 5G UPF
    OpenStack v.s. Kubernetes
    C#- FTP递归下载文件
    C#- WinForm获取 当前执行程序路径的几种方法
    C#- 布署WinForm程序
    Delphi- 连接MySQL数据库BDE
    Delphi- 内置数据库的使用例子BDE
    CSS- 兼容样式记录
    Delphi- DLL操作
  • 原文地址:https://www.cnblogs.com/nsnow/p/5046774.html
Copyright © 2011-2022 走看看