优化算法——牛顿法(Newton Method)

article/2025/9/14 4:32:22

一、牛顿法概述

除了前面说的梯度下降法,牛顿法也是机器学习中用的比较多的一种优化算法。牛顿法的基本思想是利用迭代点 处的一阶导数(梯度)和二阶导数(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());}
}

 

http://chatgpt.dhexx.cn/article/Wij067NE.shtml

相关文章

牛顿法(Newton‘s method)求函数极小值

牛顿法一般指牛顿迭代法&#xff0c;也叫做牛顿-拉夫逊&#xff08;拉弗森&#xff09;方法&#xff08;Newton-Raphson method),其最初的作用是用来求解函数的零点&#xff0c;但是也可以像梯度下降方法一样&#xff0c;以迭代的形式来求函数的极值。而事实上&#xff0c;牛顿…

牛顿法(Newton Method)的原理和实现步骤

牛顿法的法的目的 牛顿法不仅可以用来求解函数的极值问题&#xff0c;还可以用来求解方程的根&#xff0c;二者在本质上是一个问题&#xff0c;因为求解函数极值的思路是寻找导数为0的点&#xff0c;这就是求解方程。 牛顿法的法的原理 一元函数的情况 根据一元函数的泰勒展…

牛顿法

《牛顿法》   牛顿法&#xff08;Newton method&#xff09;和拟牛顿法&#xff08;quasi Newton method&#xff09;是求解无约束最优化问题的常用方法&#xff0c;有收敛速度快的优点。牛顿法是迭代算法&#xff0c;每一步都需求解目标函数的海塞矩阵&#xff08;Hessian …

使用Andriod Device Moniter时用正则表达式筛选指定日志

有时候我们想过滤出指定的一个或者几个日志&#xff0c;又或者屏蔽掉一些无意义的日志&#xff0c;那么可以创建一个筛选&#xff0c;在此页面的by Log Tag填写如下格式的表达式&#xff1a; 过滤出指定tag的日志信息&#xff1a;^(?:tag1|tag2|tag3) 忽略指定tag的日志信息…

使用Memberane Moniter监控HTTP SOAP requests

Memberane Moniter 使用方法见左侧Documentation 此工具可以监控到每一次发生在指定端口的http请求或者soap请求&#xff0c;如图所示。 但是个人认为仍然有几个问题&#xff1a; 1.不能真正的监控8080端口&#xff0c;我个人认为他的原理是类似于复制了一遍8080端口的内容&am…

linux( sudo bmon ) 流量监控工具----类似于 moniter interface

sudo bmon monitor bandwidth interface eth0 &#xff08;vyos 把 bmon 的linux 改为 了 moniter interface 了&#xff0c;底层还是调用的 bmon&#xff09; Linux:~$ sudo bmon -h bmon 3.5 Copyright (C) 2001-2013 by Thomas Graf <tgrafsuug.ch> Copyright (C) 2…

Android Device Moniter部分问题的解决办法:

一、Android Device Moniter中File explorer显示空白的问题不显示内容&#xff1a; 解决办法&#xff1a; 如上图所示 1.Tools->Android->Enable ADB Integration处于关闭状态。 2.重新打开Android Device Moniter。 3.若还处于空白状态&#xff0c;则极有可能是ja…

操作系统锁的实现方法有哪几种_深入理解多线程(四)——Moniter的实现原理...

本文是《深入理解多线程系列文章》的第四篇。点击查看原文&#xff0c;阅读该系列所有文章。 在深入理解多线程(一)——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter…

操作系统锁的实现方法有哪几种_深入理解多线程(四)—— Moniter的实现原理

文章来源&#xff1a;深入理解多线程&#xff08;四&#xff09;—— Moniter的实现原理 原文作者&#xff1a;Hollis 来源平台&#xff1a;微信公众号 在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理 中介绍过关于Synchronize的实现原理&#xff0c;无…

【深入理解多线程】 Moniter的实现原理(四)

在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么…

synchronized实现原理之---Moniter的实现原理

上一篇synchronized的实现原理提到了moniter&#xff0c;当时没有介绍它。 无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么是Monitor。 操作系统中的管程 如果你在大…

dubbokeeper-moniter部署指南

moniter在整个dubbo架构中的角色: 使用的1.0.1版本: ## 1.0.1版本变动内容 dubbokeeper在1.0.1版本对监控数据存储模块抽离出来&#xff0c;做为单独的应用部署&#xff0c;而不是和1.0.0版本和前端展示集成在一个应用里面在1.0.0版本中暂时提供了mysql以及1.0.0中已有的lucene…

Abaqus2022不能进行多核计算问题以及提交运算moniter不显示信息问题

近期换了新电脑&#xff0c;安装了abaqus2022&#xff0c;但出现了使用多核无法计算的问题&#xff0c;只能使用单核&#xff1b;另外使用单核计算时&#xff0c;moniter中不显示计算的信息&#xff0c;只能看到结果等。 问题如下&#xff1a; 在网上也找了好多的解决方式&…

深入理解多线程(四)— Moniter的实现原理

深入理解多线程&#xff08;四&#xff09;— Moniter的实现原理 在深入理解多线程&#xff08;一&#xff09;—Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、mon…

锁机制初探(五)Moniter的实现原理

在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么…

Moniter

了解这个Moniter的实现原理之前&#xff0c;可以说大家已经初步了解了synchronized的底层原理了。无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的。 那我们就简单了解下什么Monitor吧&#xff01;&#…

java什么是monitor和Monitor监视器锁、对象布局

文章目录 Monitor监视器锁什么是moniter对象布局 Monitor监视器锁 每个同步对象都有一个自己的Monitor(监视器锁)&#xff0c;加锁过程如下图所示&#xff1a; 任何一个对象都有一个Monitor与之关联&#xff0c;当且一个Monitor被持有后&#xff0c;它将处于锁定状态。Synchro…

Dense Teacher

“从稀疏到密集”的范式使SSOD的流程复杂化&#xff0c;同时忽略了强大的直接、密集的教师监督 - 最新半监督检测框架 论文地址&#xff1a;https://arxiv.org/pdf/2207.05536.pdf Mean-Teacher (MT) 方案在半监督目标检测 (SSOD) 中被广泛采用。在MT中&#xff0c;由教师的最…

Sequential模型、Flatten层、Dense层

Sequential模型 顺序模型 核心操作是添加layers,有两种方法 第一种:通过add()添加 model Sequential() model.add(tf.keras.layers.Dense(10,input_shape(1,)&#xff0c;activationrelu))#10表示输出数据的维度&#xff0c;后面表示输入的形状,激活函数为relu model.add(tf…

【Python-Keras】keras.layers.Dense层的解析与使用

1 Dense解析 keras.layers.Dense(units, activationNone, use_biasTrue, kernel_initializerglorot_uniform, bias_initializerzeros, kernel_regularizerNone, bias_regularizerNone, activity_regularizerNone, kernel_constraintNone, bias_constraintNone)实现神经网络里的…