优化算法——梯度下降法

转载:http://blog.csdn.net/google19890102/article/details/17842831


   在机器学习,我们需要寻找输入特征与标签之间的映射关系,在寻找这样的映射关系时,有一条重要的原则就是使得寻找到的映射结果与原始标签之间的误差最小。机器学习问题归纳起来就是把一个学习的问题转化为优化的问题,机器学习算法的本质就是如何对问题抽象建模,使一个学习的问题变为一个可求解的优化问题。

    优化的算法有很多种,从最基本的梯度下降法到现在的一些启发式算法,如遗传算法(GA),差分演化算法(DE),粒子群算法(PSO)和人工蜂群算法(ABC)。

    梯度下降法又被称为最速下降法(Steepest descend method),其理论基础是梯度的概念。梯度与方向导数的关系为:梯度的方向与取得最大方向导数值的方向一致,而梯度的模就是函数在该点的方向导数的最大值。对于一个无约束的优化问题: ,例如

如图,在处的切线。显然在处函数取得最小值。沿着梯度的方向是下降速度最快的方向。具体的过程为:初始时,任取的值,如取,则对应的。利用梯度下降法,其中为学习率,可以取固定常数。如取,则,对应的,类似的,对应的。算法终止的判断准则是:,其中是一个指定的阈值。梯度的更新公式为:

梯度下降法的流程:

1、初始化:随机选取取值范围内的任意数

2、循环操作:

       计算梯度;

       修改新的变量;

       判断是否达到终止:如果前后两次的函数值差的绝对值小于阈值,则跳出循环;否则继续;

3、输出最终结果

    与梯度下降法对应的是被称为梯度上升的算法,主要的区别就是在梯度的方向上,一个方向是下降最快的方向,相反的就是梯度上升最快的方法。主要用来求解最大值问题:。梯度的更新公式为:

下面以为例,给出一下的Java程序:

public class SteepestDescend {  
    public static double alpha = 0.5;// 迭代步长  
    public static double e = 0.00001;// 收敛精度  
  
    public double x0;  
    public double y0;  
  
    public double getY(double x) {  
        return (x * x - 3 * x + 2);  
    }  
  
    public double getDerivative(double x) {  
        return (2 * x - 3);  
    }  
  
    public void init() {  
        x0 = 0;  
        y0 = this.getY(x0);  
    }  
  
    public double getSteepestDescend() {  
        double min = 0;  
        double x = x0;  
        double y = y0;  
        double y1;  
        double temp = 0;  
        /* 
         * 做梯度运算 
         */  
        while (true) {  
            temp = this.getDerivative(x);  
            x = x - alpha * temp;  
            y1 = this.getY(x);  
            if (Math.abs(y1 - y) <= e) {  
                break;  
            }  
            y = y1;  
            min = y;  
        }  
        return min;  
    }  
}  


主函数:

public class TestMain {  
    public static void main(String args[]) {  
        double min;  
        SteepestDescend sd = new SteepestDescend();  
        sd.init();  
        min = sd.getSteepestDescend();  
        System.out.println("最小值:"+ min );  
    }  
  
}  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值