梯度下降法,一阶曲线拟合

    程序文件 study2.m

function study2()
    count=7;
    n=1;
    %X=[1 2 3 4 5 4.2 6 7 8]';
    %Y=[5,4,5,4.5,5,6,6 4 3]';
    X=1:10;
 Y=rand(1,10)*100;
 sita=rand(n,1);
 overvalue=-1;
 count=0;
 b=(max(Y)+min(Y))/2;  %%假设函数为 h(x)=sita*x+b
    while 8<(J=calJ())&&(abs(J-overvalue)>0.0001) 
      study();
  overvalue=J;
  count=count+1;
      draw();
  sleep(0.01)
    endwhile
 count
    draw();
    
    function ans=calJ()
      ans=sum((X*sita+b-Y).^2)/2;
    endfunction
    
    function study()
      sita=sita-0.003*sum((X*sita+b-Y).*X);
    endfunction 
   
    function draw()
        hold off
        plot(X,Y,'*');
        hold on
        tempx=linspace(0,max(X)*5/4,3);
        tempy=tempx*sita+b;
        plot(tempx,tempy);
    endfunction
endfunction

    执行过程如下所示

     

   一个简单的学习算法,其中学习速度选取很关键,就是子函数study中0.003代表的意思,如果选取过大会发现曲线震荡发散不收敛,选取过小学习时间太长。决定了整个系统学习的效率。

    上图演示的时候我将sita=zeros(n,1)了,因为要有一个好的动画效果 -_-! ,开头代码中所用的随机数实际效果更好。



转载于:https://my.oschina.net/000quanwei/blog/506202

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值