梯度下降法求解线性回归之matlab实现

来源:互联网 发布:relief 人工智能 编辑:程序博客网 时间:2024/06/05 19:21

线性回归其实就是寻找一条直线拟合数据点,使得损失函数最小。直线的表达式为:

yi=ω1xi,1+ω2xi,2+ωjxi,j+...+b

损失函数的表达式为:
J=12i=0m(yiypredict_i)2

其中m为数据点总数。
现在我们使用梯度下降法求解函数J的最小值,梯度下降法原理示意图如下:

这里写图片描述
如上图所示,只要自变量x沿着负梯度的方向变化,就可以到达函数的最小值了,反之,如果沿着正梯度方向变化,就可以到达函数的最大值。
我们要求解J函数的最小值,那么就要求出每个ω的梯度和b的梯度,由于梯度太大,可能会导致自变量沿着负梯度方向变化时,J的值出现震荡,而不是一直变小,所以在梯度的前面乘上一个很小的系数α
由以上可以总结出ωb的更新公式:

ωj=ωjαJ(ωj)

b=bαJ(b)

梯度公式(其实就是求导而已):
J(ωj)=Jωj=i=0m(yiypredict_i)(xi,j)=i=0m(ypredict_iyi)xi,j

J(b)=Jb=i=0m(ypredict_iyi)

系数α如果随着迭代的进行越来越小的话,有利于防止迭代后期震荡的发生,是算法收敛,α的更新公式:
α=1i+1+0.001

其中i是迭代次数,起始为0
下面是matlab的具体实现


样例数据

x = linspace(-2,2,40)';y = 2*x+rand(length(x),1);

开始迭代

for i = 1:maxgen    alpha = 1/i+alpha0;    e = x*seta+b-y;    mse = norm(e);    delta_seta = e'*x;    delta_seta_norm = norm(delta_seta);    b = b-alpha*sum(e);    seta = seta-alpha*delta_seta;    disp(strcat('迭代次数:',num2str(i)));    disp(strcat('梯度:',num2str(delta_seta_norm),';seta:',num2str(seta),';b:',num2str(b),';mse:',num2str(mse)))    disp(strcat('alpha:',num2str(alpha),';sum(e):',num2str(sum(e))))end

程序运行结果:


这里写图片描述

这里写图片描述

0 0
原创粉丝点击