线性回归梯度下降matlab实现

来源:互联网 发布:nginx http2.0 配置 编辑:程序博客网 时间:2024/05/23 14:33

接中午的理论部分

clc;clear;%x0 = 1,h(x) = x0*sita0 + x1*sita1+........x = [1 1.15    1,1.9    1,3.06    1,4.66    1,6.84    1,7.95];y = [1.37,2.4,3.02,3.06,4.22,5.42];subplot(1,2,1);plot(x(:,2),y);hold on;%×î´óµü´ú´ÎÊýloop_max = 10000;%ÊÕÁ²µÄ¾«¶Èepsilon = 0.0001;%µü´ú²½³¤alpha =0.001;%diff  = 0;lastsita0 = 0;  lastsita1 = 0;m = size(x,1);sita = [0,0];count = 0;finish = 0;n = input('choose the method of gradient descent:1.incremental gradient descent  2.batch gradient descent\n');switch(n)    case(1)%ÔöÁ¿ÌݶÈϽµ        while count<loop_max             count = count+1            for i = 1:1:m            diff = sita(1)*x(i,1) + sita(2)*x(i,2) - y(i);            sita(1) = sita(1) - alpha * diff*x(i,1);            sita(2) = sita(2) - alpha * diff*x(i,2);            end            %ÅжÏÊÇ·ñÐèÒª¼ÌÐøµü´ú             if(abs(sita(1) - lastsita0)<epsilon && abs(sita(2) - lastsita1)<epsilon)               finish = 1;             else                lastsita0 = sita(1);                lastsita1 = sita(2);                sita                diff                subplot(1,2,2);                line(count,diff,'Marker','.');                ylabel('×îС¾ù·½');                xlabel('µü´ú´ÎÊý');                hold on;             end            if (finish ==1)              break;            end        end%end of while%ÅúÌݶÈϽµ        case (2)            sum = 0;            while count<loop_max                count = count+1                for i = 1:1:m                    diff = sita(1)*x(i,1) + sita(2)*x(i,2) - y(i);                    sum= sum +diff*x(i,1);                end                sita(1) = sita(1)- alpha*sum;                sum =0;                for i = 1:1:m                     diff = sita(1)*x(i,1) + sita(2)*x(i,2) - y(i);                     sum= sum +diff*x(i,2);                end                sita(2) = sita(2)- alpha*sum;                if(abs(sita(1) - lastsita0)<epsilon && abs(sita(2) - lastsita1)<epsilon)                    finish = 1;                else                     lastsita0 = sita(1);                     lastsita1 = sita(2);                     sita                     diff                     subplot(1,2,2);                     line(count,diff,'Marker','.');                     ylabel('×îС¾ù·½');                     xlabel('µü´ú´ÎÊý');                     hold on;                end            if (finish ==1)              break;            end           end%end of whileend%end of switchsubplot(1,2,1);plot(x(:,2),sita(1)+sita(2)*x(:,2),'r')

注释全乱码了。。。。–!
准备用线性回归来拟合y = 1+0.5x。
分别用了增量梯度下降和批梯度下降来计算LMS的最小值。理想的真实值当然是这里写图片描述1=1,这里写图片描述2=0.5,增量梯度下降方法和批梯度下降方法个选用了 步长为0.001,0.005,0.0001三种情况,发现学习速率对参数确定的结果的影响很大,学习速率太大太小都不能得到准确的结果。下面是三种情况的结果显示图

步长为0.005,增量梯度下降

564次迭代 结果为1.0664,0.5154

步长为0.001,增量梯度下降

1809次迭代 结果为1.0439,0.5140

步长为0.0001,增量梯度下降

2633次迭代 结果为0.4413,0.6196,步长太小结果不理想(原因)

步长为0.001,批梯度下降

511次迭代 结果为1.1022,0.5029

步长为0.005,批梯度下降

1340次迭代 结果为1.039,0.5140

在把批梯度和增量梯度的区别发出来看下
这里写图片描述

0 0
原创粉丝点击