zoukankan      html  css  js  c++  java
  • 在matlab中实现梯度下降法

    梯度下降法的原理,本文不再描述,请参阅其它资料。

    梯度下降法函数function [k ender]=steepest(f,x,e),需要三个参数f、x和e,其中f为目标函数,x为初始点,e为终止误差。输出也为两个参数,k表示迭代的次数,ender表示找到的最低点。

    steepest.m:

    function [k ender]=steepest(f,x,e)
    %梯度下降法,f为目标函数(两变量x1和x2),x为初始点,如[3;4]
    syms x1 x2 m; %m为学习率
    d=-[diff(f,x1);diff(f,x2)];  %分别求x1和x2的偏导数,即下降的方向
    flag=1;  %循环标志
    k=0; %迭代次数
    while(flag)
        d_temp=subs(d,x1,x(1));      %将起始点代入,求得当次下降x1梯度值
        d_temp=subs(d_temp,x2,x(2)); %将起始点代入,求得当次下降x2梯度值
        nor=norm(d_temp); %范数
        if(nor>=e)
            x_temp=x+m*d_temp;            %改变初始点x的值
            f_temp=subs(f,x1,x_temp(1));  %将改变后的x1和x2代入目标函数
            f_temp=subs(f_temp,x2,x_temp(2));
            h=diff(f_temp,m);  %对m求导,找出最佳学习率
            m_temp=solve(h);   %求方程,得到当次m
            x=x+m_temp*d_temp; %更新起始点x
            k=k+1;
        else
            flag=0;
        end
    end
    ender=double(x);  %终点
    end

    调用示例1:

    syms x1 x2;
    f=(x1-2)^2+2*(x2-1)^2;
    x=[1;3];
    e=10^(-20);
    [k ender]=steepest(f,x,e)

    结果:

    k =
    
        27
    
    
    ender =
    
         2
         1


    调用示例2:

    syms x1 x2;
    f=x1-x2+2*x1^2+2*x1*x2+x2^2;
    x=[0;0];
    e=10^(-20);
    [k ender]=steepest(f,x,e)

    结果:

    k =
    
        58
    
    
    ender =
    
       -1.0000
        1.5000


    调用示例3:

    syms x1 x2;
    f=3/2*x1^2+1/2*x2^2-x1*x2-2*x1;
    x=[0;0];
    e=10^(-2);
    [k ender]=steepest(f,x,e)


    结果:

    k =
    
         9
    
    
    ender =
    
        0.9959
        0.9877
  • 相关阅读:
    Spring scope注解
    classpath与clsspath*
    Hadoop 5 Hbase 遇到的问题
    Hadoop 3
    Hadoop 4 MapReduce
    Hadoop 2
    Hadoop 1
    毕业设计---jQuery动态生成的a标签的事件绑定
    毕业设计---json,Struts,ajax以及JQuery简单案例
    基于SSH框架的学生选课质量属性分析
  • 原文地址:https://www.cnblogs.com/denny402/p/4025472.html
Copyright © 2011-2022 走看看