一、牛顿法概述

除了前面说的梯度下降法,牛顿法也是机器学习中用的比较多的一种优化算法。牛顿法的基本思想是利用迭代点处的一阶导数(梯度)和二阶导数(Hessen矩阵)对目标函数进行二次函数近似,然后把二次模型的极小点作为新的迭代点,并不断重复这一过程,直至求得满足精度的近似极小值。牛顿法的速度相当快,而且能高度逼近最优值。牛顿法分为基本的牛顿法和全局牛顿法。

二、基本牛顿法

1、基本牛顿法的原理

基本牛顿法是一种是用导数的算法,它每一步的迭代方向都是沿着当前点函数值下降的方向。
我们主要集中讨论在一维的情形,对于一个需要求解的优化函数,求函数的极值的问题可以转化为求导函数。对函数进行泰勒展开到二阶,得到
对上式求导并令其为0,则为
即得到
这就是牛顿法的更新公式。

2、基本牛顿法的流程

  1. 给定终止误差值,初始点,令
  2. 计算,若,则停止,输出
  3. 计算,并求解线性方程组得解
  4. ,并转2。

三、全局牛顿法

牛顿法最突出的优点是收敛速度快,具有局部二阶收敛性,但是,基本牛顿法初始点需要足够“靠近”极小点,否则,有可能导致算法不收敛。这样就引入了全局牛顿法。

1、全局牛顿法的流程

  1. 给定终止误差值,初始点,令
  2. 计算,若,则停止,输出
  3. 计算,并求解线性方程组得解
  4. 是不满足下列不等式的最小非负整数
  5. ,并转2。

2、Armijo搜索

全局牛顿法是基于Armijo的搜索,满足Armijo准则:
给定,令步长因子,其中是满足下列不等式的最小非负整数:

四、算法实现

实验部分使用Java实现,需要优化的函数,最小值为

1、基本牛顿法Java实现

package org.algorithm.newtonmethod;/*** Newton法* * @author dell* */
public class NewtonMethod {private double originalX;// 初始点private double e;// 误差阈值private double maxCycle;// 最大循环次数/*** 构造方法* * @param originalX初始值* @param e误差阈值* @param maxCycle最大循环次数*/public NewtonMethod(double originalX, double e, double maxCycle) {this.setOriginalX(originalX);this.setE(e);this.setMaxCycle(maxCycle);}// 一系列get和set方法public double getOriginalX() {return originalX;}public void setOriginalX(double originalX) {this.originalX = originalX;}public double getE() {return e;}public void setE(double e) {this.e = e;}public double getMaxCycle() {return maxCycle;}public void setMaxCycle(double maxCycle) {this.maxCycle = maxCycle;}/*** 原始函数* * @param x变量* @return 原始函数的值*/public double getOriginal(double x) {return x * x - 3 * x + 2;}/*** 一次导函数* * @param x变量* @return 一次导函数的值*/public double getOneDerivative(double x) {return 2 * x - 3;}/*** 二次导函数* * @param x变量* @return 二次导函数的值*/public double getTwoDerivative(double x) {return 2;}/*** 利用牛顿法求解* * @return*/public double getNewtonMin() {double x = this.getOriginalX();double y = 0;double k = 1;// 更新公式while (k <= this.getMaxCycle()) {y = this.getOriginal(x);double one = this.getOneDerivative(x);if (Math.abs(one) <= e) {break;}double two = this.getTwoDerivative(x);x = x - one / two;k++;}return y;}}

2、全局牛顿法Java实现

package org.algorithm.newtonmethod;/*** 全局牛顿法* * @author dell* */
public class GlobalNewtonMethod {private double originalX;private double delta;private double sigma;private double e;private double maxCycle;public GlobalNewtonMethod(double originalX, double delta, double sigma,double e, double maxCycle) {this.setOriginalX(originalX);this.setDelta(delta);this.setSigma(sigma);this.setE(e);this.setMaxCycle(maxCycle);}public double getOriginalX() {return originalX;}public void setOriginalX(double originalX) {this.originalX = originalX;}public double getDelta() {return delta;}public void setDelta(double delta) {this.delta = delta;}public double getSigma() {return sigma;}public void setSigma(double sigma) {this.sigma = sigma;}public double getE() {return e;}public void setE(double e) {this.e = e;}public double getMaxCycle() {return maxCycle;}public void setMaxCycle(double maxCycle) {this.maxCycle = maxCycle;}/*** 原始函数* * @param x变量* @return 原始函数的值*/public double getOriginal(double x) {return x * x - 3 * x + 2;}/*** 一次导函数* * @param x变量* @return 一次导函数的值*/public double getOneDerivative(double x) {return 2 * x - 3;}/*** 二次导函数* * @param x变量* @return 二次导函数的值*/public double getTwoDerivative(double x) {return 2;}/*** 利用牛顿法求解* * @return*/public double getGlobalNewtonMin() {double x = this.getOriginalX();double y = 0;double k = 1;// 更新公式while (k <= this.getMaxCycle()) {y = this.getOriginal(x);double one = this.getOneDerivative(x);if (Math.abs(one) <= e) {break;}double two = this.getTwoDerivative(x);double dk = -one / two;// 搜索的方向double m = 0;double mk = 0;while (m < 20) {double left = this.getOriginal(x + Math.pow(this.getDelta(), m)* dk);double right = this.getOriginal(x) + this.getSigma()* Math.pow(this.getDelta(), m)* this.getOneDerivative(x) * dk;if (left <= right) {mk = m;break;}m++;}x = x + Math.pow(this.getDelta(), mk)*dk;k++;}return y;}
}

3、主函数

package org.algorithm.newtonmethod;/*** 测试函数* @author dell**/
public class TestNewton {public static void main(String args[]) {NewtonMethod newton = new NewtonMethod(0, 0.00001, 100);System.out.println("基本牛顿法求解:" + newton.getNewtonMin());GlobalNewtonMethod gNewton = new GlobalNewtonMethod(0, 0.55, 0.4,0.00001, 100);System.out.println("全局牛顿法求解:" + gNewton.getGlobalNewtonMin());}
}

优化算法——牛顿法(Newton Method)相关推荐

  1. 牛顿法 Newton Method

    上一次我们讨论了具有 Q-线性收敛性的普通的 gradient descent 方法,今天我们要介绍一种收敛速度更快的算法:Newton Method(或者叫 Newton's Method). 可能 ...

  2. 经典凸优化算法(牛顿法,BFGS)的python实现

    文章目录 牛顿法 代码 结果 BFGS 代码 结果 就如文章标题所示,只是简单的代码整理,用于数模比赛的准备(虽然并没有用上) 算法的数学原理请查阅前人blog 牛顿法 代码 这里我演示的函数为 f( ...

  3. 优化算法——拟牛顿法之BFGS算法

    一.BFGS算法简介 BFGS算法是使用较多的一种拟牛顿方法,是由Broyden,Fletcher,Goldfarb,Shanno四个人分别提出的,故称为BFGS校正. 同DFP校正的推导公式一样,D ...

  4. 牛顿法(Newton‘s method)和拟牛顿法(quasi Newton method)

    简述 在看伊恩·古德费洛的深度学习,4.3节基于梯度的优化方法时提到 仅使用梯度信息的优化算法称为 一阶优化算法 ,如梯度下降. 使用Hessian矩阵的优化算法称为 二阶最优化算法 ,如牛顿法. 牛 ...

  5. matlab共轭梯度法_优化算法之牛顿法

    牛顿法(Newton's method)是一种在实数域和复数域上近似求解方程的方法,,它使用函数f(x)的泰勒级数的前面几项来寻找方程f(y)=0的根. 牛顿法最初由艾萨克·牛顿在<Method ...

  6. 机器学习、深度学习中常用的优化算法详解——梯度下降法、牛顿法、共轭梯度法

    一.梯度下降法 1.总述: 在机器学习中,基于基本的梯度下降法发展了三种梯度下降方法,分别为随机梯度下降法,批量梯度下降法以及小批量梯度下降法. (1)批量梯度下降法(Batch Gradient D ...

  7. 常用的优化算法:梯度下降法,牛顿法,拟牛顿法,共轭梯度法

    目录 0.几个数学概念 1. 梯度下降法(Gradient Descent) 2. 牛顿法和拟牛顿法(Newton's method & Quasi-Newton Methods) 3. 共轭 ...

  8. 优化算法(一):牛顿法与拟牛顿法

    机器学习算法中经常碰到非线性优化问题,如 Sparse Filtering 算法,其主要工作在于求解一个非线性极小化问题.在具体实现中,大多调用的是成熟的软件包做支撑,其中最常用的一个算法是 L-BF ...

  9. 优化算法之梯度下降法、牛顿法、拟牛顿法和拉格朗日乘数法

      在机器学习中,优化方法是其中一个非常重要的话题,最常见的情形就是利用目标函数的导数通过多次迭代来求解最优化问题. - 无约束最优化问题:梯度下降法.牛顿法.拟牛顿法: - 有约束最优化问题:拉格朗 ...

最新文章

  1. TCP/IP协议簇简介
  2. did双重差分法_Stata中双重差分操流程及代码
  3. P1450 [HAOI2008]硬币购物
  4. JavaWeb笔记04-解决GET与POST乱码问题
  5. 服务器控件开发之复杂属性
  6. python机器学习:决策树ID3、C4.5
  7. 计算机用户名uz,Dnuznq全国计算机二级考试vb试题.doc
  8. 树莓派 pcf8591 AD转换模块使用
  9. RFID电子耳标识别棒,牦牛身份识别管理专用设备
  10. Asp.Net Web Api 部署------在云服务器IIS上部署Web Api程序
  11. nodejs模块加载的猜想
  12. matlab_plot实时画点
  13. vue之原生上传图片并压缩图片大小(1)
  14. centos7安装OTRS开源工单管理平台
  15. 15位和18位的身份证正则,以及通过身份证获取出生日期
  16. UEdit 使用总结
  17. “0x00000014”内存。该内存不能为“Written”(或“Read”)的解决办法。
  18. GZIP文件格式简介
  19. 【测试工具】五、jmeter在GUI与non-GUI模式下结果集自定义封装展示
  20. iOS---集成融云SDK即时通讯

热门文章

  1. 初识STM32单片机
  2. STM32单片机和51单片机区别
  3. 计算机网络的一些整理
  4. VS2019 编译+调试 Bullet
  5. Xcode如何通过Coding.net托管代码
  6. 计算机云教室解说词,老师眼中理想的云教室是怎样的
  7. Android插件化开发指南——实践之Activity转场效果(仿酷狗音乐启动页)
  8. Command ‘cnpm‘ not found解决方法
  9. axios 使用详解
  10. 锐捷路由器CHAP 单向认证 双向认证