优化算法——牛顿法(Newton Method)
时间:2022-05-04
本文章向大家介绍优化算法——牛顿法(Newton Method),主要内容包括一、牛顿法概述、二、基本牛顿法、2、基本牛顿法的流程、三、全局牛顿法、2、Armijo搜索、四、算法实现、2、全局牛顿法Java实现、3、主函数、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一、牛顿法概述
除了前面说的梯度下降法,牛顿法也是机器学习中用的比较多的一种优化算法。牛顿法的基本思想是利用迭代点
处的一阶导数(梯度)和二阶导数(Hessen矩阵)对目标函数进行二次函数近似,然后把二次模型的极小点作为新的迭代点,并不断重复这一过程,直至求得满足精度的近似极小值。牛顿法的速度相当快,而且能高度逼近最优值。牛顿法分为基本的牛顿法和全局牛顿法。
二、基本牛顿法
1、基本牛顿法的原理
2、基本牛顿法的流程
三、全局牛顿法
牛顿法最突出的优点是收敛速度快,具有局部二阶收敛性,但是,基本牛顿法初始点需要足够“靠近”极小点,否则,有可能导致算法不收敛。这样就引入了全局牛顿法。
1、全局牛顿法的流程
2、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());
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法