利用梯度下降法实现线性回归的算法及matlab实现

  • 格式:docx
  • 大小:194.19 KB
  • 文档页数:7

下载文档原格式

  / 7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用梯度下降法实现线性回归的算法及matlab实现

1.线性回归算法概述

线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个线性函数,然后测试这个函数训练的好不好(即此函数是否足够拟合训练集数据),挑选出最好的函数(cost function最小)即可;

注意:

(1)因为是线性回归,所以学习到的函数为线性函数,即直线函数;

(2)线性回归可分为单变量线性回归和多变量线性回归;对于单变量线性回归而言,只有一个输入变量x;

(1).单变量线性回归

我们能够给出单变量线性回归的模型:

我们常称x为feature,h(x)为hypothesis;上述模型中的θ0和θ1在代码中分别用theta0和theta1表示。

从上面“方法”中,我们肯定有一个疑问,怎么样能够看出线性函数拟合的好不好呢?我们需要使用到Cost Function(代价函数),代价函数越小,说明线性回归地越好(和训练集拟合地越好),当然最小就是0,即完全拟合。cost Function的内部构造如下面公式所述:

其中:

表示向量x中的第i个元素;

表示向量y中的第i个元素;

表示已知的假设函数;

m为训练集的数量;

1

虽然给定一个函数,我们能够根据cost function知道这个函数拟合的好不好,但是毕竟函数有这么多,总不可能一个一个试吧?因此我们引出了梯度下降:能够找出cost function函数的最小值;

梯度下降原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快;当然解决问题的方法有很多,梯度下降只是其中一个,还有一种方法叫Normal Equation;

方法:

(1)先确定向下一步的步伐大小,我们称为Learning rate(alpha);

(2)任意给定一个初始值:(用theta0和theta1表示);

(3)确定一个向下的方向,并向下走预先规定的步伐,并更新;

(4)当下降的高度小于某个定义的值,则停止下降;

算法

特点:

(1)初始点不同,获得的最小值也不同,因此梯度下降求得的只是局部最小值;

(2)越接近最小值时,下降速度越慢;

梯度下降能够求出一个函数的最小值;

2

线性回归需要使得cost function的最小;

因此我们能够对

cost function运用梯度下降,即将梯度下降和线性回归进行整合,如下图所示:上式中右边的公式推导过程如下:

ðℎθ

0=1

ðℎθ

1

=x(i)

ð0Jθ0,θ1=

1

2×(ℎθ x(i)−y(i))×

ðℎθ

m

i=1

=

1

(ℎθ x(i)−y(i))

m

i=1

ððθ1Jθ0,θ1=

1

2m

2×(ℎθ x(i)−y(i))×

ðℎθ

ðθ1

m

i=1

=

1

m

(ℎθ x(i)−y(i))×

m

i=1

x(i)

3

从上面的推导中可以看出,要想满足梯度下降的条件,则(ℎθ x(i)−y(i))项后面必须乘以对应的输入信号x(i)。

梯度下降是通过不停的迭代,而我们比较关注迭代的次数,因为这关系到梯度下降的执行速度,为了减少迭代次数,因此引入了Feature Scaling。

(2).Feature Scaling

此种方法应用于梯度下降,为了加快梯度下降的执行速度;

思想:将各个feature的值标准化,使得取值范围大致都在-1<=x<=1之间;

常用的方法是Mean Normalization,即

或者:

[X-mean(X)]/std(X);

2.Matlab实现梯度下降的线性回归

(1).Gradient descend code 1

clear all

clc

% training sample data;

p0=3;

p1=7;

x=1:3;

y=p0+p1*x;

num_sample=size(y,2);

4

% gradient descending process

% initial values of parameters

theta0=1;

theta1=3;

%learning rate

alpha=0.02;

% if alpha is too large, the final error will be much large.

% if alpha is too small, the convergence will be slow

epoch=500;

for k=1:epoch

v_k=k

h_theta_x=theta0+theta1*x; % hypothesis function

Jcost(k)=((h_theta_x(1)-y(1))^2+(h_theta_x(2)-y(2))^2+(h_theta_x(3)-y(3))^2)/num_sample

theta0=theta0-alpha*((h_theta_x(1)-y(1))+(h_theta_x(2)-y(2))+(h_theta_x(3)-y(3)))/num_sample;

theta1=theta1-alpha*((h_theta_x(1)-y(1))*x(1)+(h_theta_x(2)-y(2))*x(2)+(h_theta_x(3)-y(3))*x(3))/num_sample; end

plot(Jcost)

(2).Gradient descend code 2

clear all

clc

% training sample data;

p0=26;

p1=73;

x=1:3;

5