微信号:djangoSpace

介绍:开发者平台

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

2016-04-10 16:57 just_do_it_123

资源链接:

链接:http://pan.baidu.com/s/1qYQmo8W 密码:v7tq

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


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


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



由以上可以总结出wb的更新公式: 


梯度公式(其实就是求导而已): 



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


其中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

程序运行结果:



 
djangoSpace 更多文章 为什么要学习julia这门语言? 遗传算法的matlab实现 python VS matlab 使用R和Python计算AUC(干货) 十行以内,你写过哪些比较酷的 Matlab 代码?
猜您喜欢 感谢关注程序员资源公众号 从ListView到RecyclerView 教你使用设计支持库:BottomSheets 2015 Ctrip Tech Open House 隆重开幕 如何辨认身边的聪明人?