Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression

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

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

本讲内容:

Matlab 实现各种回归函数

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

基本模型

Y=θ01X1型---线性回归(直线拟合)

解决过拟合问题---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=θ01X1型---线性回归(直线拟合)

 

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

时间: 2024-12-21 02:11:01

Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression的相关文章

分类和逻辑回归(Classification and logistic regression),广义线性模型(Generalized Linear Models) ,生成学习算法(Generative Learning algorithms)

分类和逻辑回归(Classification and logistic regression) http://www.cnblogs.com/czdbest/p/5768467.html 广义线性模型(Generalized Linear Models) http://www.cnblogs.com/czdbest/p/5769326.html 生成学习算法(Generative Learning algorithms) http://www.cnblogs.com/czdbest/p/5771

逻辑回归模型(Logistic Regression)及Python实现

逻辑回归模型(Logistic Regression)及Python实现 http://www.cnblogs.com/sumai 1.模型 在分类问题中,比如判断邮件是否为垃圾邮件,判断肿瘤是否为阳性,目标变量是离散的,只有两种取值,通常会编码为0和1.假设我们有一个特征X,画出散点图,结果如下所示.这时候如果我们用线性回归去拟合一条直线:hθ(X) = θ0+θ1X,若Y≥0.5则判断为1,否则为0.这样我们也可以构建出一个模型去进行分类,但是会存在很多的缺点,比如稳健性差.准确率低.而逻辑

分类和逻辑回归(Classification and logistic regression)

分类问题和线性回归问题问题很像,只是在分类问题中,我们预测的y值包含在一个小的离散数据集里.首先,认识一下二元分类(binary classification),在二元分类中,y的取值只能是0和1.例如,我们要做一个垃圾邮件分类器,则为邮件的特征,而对于y,当它1则为垃圾邮件,取0表示邮件为正常邮件.所以0称之为负类(negative class),1为正类(positive class) 逻辑回归 首先看一个肿瘤是否为恶性肿瘤的分类问题,可能我们一开始想到的是用线性回归的方法来求解,如下图:

机器学习算法笔记1_2:分类和逻辑回归(Classification and Logistic regression)

形式: 采用sigmoid函数: g(z)=11+e?z 其导数为g′(z)=(1?g(z))g(z) 假设: 即: 若有m个样本,则似然函数形式是: 对数形式: 采用梯度上升法求其最大值 求导: 更新规则为: 可以发现,则个规则形式上和LMS更新规则是一样的,然而,他们的分界函数hθ(x)却完全不相同了(逻辑回归中h(x)是非线性函数).关于这部分内容在GLM部分解释. 注意:若h(x)不是sigmoid函数而是阈值函数: 这个算法称为感知学习算法.虽然得到更新准则虽然相似,但与逻辑回归完全不

谈谈NG视频里面单线性回归、多线性回归、逻辑回归等等

明天第一节课8.55才上,还是把今天看的东西整理一下吧. 今天主要是看了NG前几章讲的单线性回归.多线性回归.逻辑回归的matlab实现,之前觉得那些东西理解还好,但是写代码好难的样子,但是今天看了大牛的代码发现真的很easy... 但是是很有技巧的用的矩阵去实现. 比如单线性回归里面的j=0和j=1这两种情况,直接把x转换成x = [ones(m, 1) x] , 第一列全是1了,刚好可以把j=0时x=1代入去运算,这样子梯度 grad = (1/m).* x' * ((x * theta) 

线性回归,逻辑回归的学习(包含最小二乘法及极大似然函数等)

博文参考了以下两位博主的文章:http://blog.csdn.net/lu597203933/article/details/45032607,http://blog.csdn.net/viewcode/article/details/8794401 回归问题的前提: 1) 收集的数据 2) 假设的模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数.然后利用这个模型去预测/分类新的数据. 1. 线性回归 假设 特征 和 结果 都满足线性.即不大于一次方.这个是针对 收集的数据

对线性回归、逻辑回归、各种回归的概念学习

http://blog.csdn.net/viewcode/article/details/8794401 回归问题的条件/前提: 1) 收集的数据 2) 假设的模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数.然后利用这个模型去预测/分类新的数据. 1. 线性回归 假设 特征 和 结果 都满足线性.即不大于一次方.这个是针对 收集的数据而言.收集的数据中,每一个分量,就可以看做一个特征数据.每个特征至少对应一个未知的参数.这样就形成了一个线性模型函数,向量表示形式: 这个就

机器学习系列:(四)从线性回归到逻辑回归

从线性回归到逻辑回归 在第2章,线性回归里面,我们介绍了一元线性回归,多元线性回归和多项式回归.这些模型都是广义线性回归模型的具体形式,广义线性回归是一种灵活的框架,比普通线性回归要求更少的假设.这一章,我们讨论广义线性回归模型的具体形式的另一种形式,逻辑回归(logistic regression). 和前面讨论的模型不同,逻辑回归是用来做分类任务的.分类任务的目标是找一个函数,把观测值匹配到相关的类和标签上.学习算法必须用成对的特征向量和对应的标签来估计匹配函数的参数,从而实现更好的分类效果

线性回归和 逻辑回归 的思考(参考斯坦福 吴恩达的课程)

还是不习惯这种公式的编写,还是直接上word.... 对上面的(7)式取log后并最大化即可得到最小二乘法,即 argmaxθ J(θ) 思考二:线性回归到逻辑回归的转变: 1) 引入逻辑回归,假设用线性回归来做分类问题,设为二分类,即y取0或1. 则会出现如下的情况: 这种情况下是能很好的分类的,但若数据是如下所示呢: 则分类很不好. 思考三:逻辑回归损失函数的得来(解释):     答,也是通过最大似然得到的.y的取值为0,1:则认为这是一个伯努力的分布,也称为两点的分布,则公式表示如下: