首页 > 编程知识 正文

数学分析stolz公式,newton method

时间:2023-05-04 16:54:54 阅读:137241 作者:1187

另一方面,dydmj法的概要除了上述的梯度下降法之外,dydmj法也是机器学习中被广泛使用的优化算法。 dydmj方法的基本思想是利用迭代点处的一阶导数(梯度)和二阶导数(Hessen矩阵)对目标函数进行二阶函数逼近,将二阶模型的极小点作为新的迭代点,重复这一过程直到获得满足精度的逼近极小值。 dydmj法的速度相当快,而且可以高度接近最佳值。 dydmj法分为基本的dydmj法和全局dydmj法。 二、基本dydmj法1、基本dydmj法的原理基本dydmj法是采用导数的算法,各步骤的迭代方向是沿当前点函数值下降的方向。 我们主要集中讨论一维情况,对于需要求解的优化函数,求函数极值问题可以转化为导数。 对函数满意的前辈在二楼展开,得到

导出上述公式,使之为0,则为

也就是说得到

这就是dydmj法的更新公式。 2、基本dydmj法流程给出终止误差值、初始点、指令; 计算,如果是,停止,输出; 计算,求解线性方程,并转2。 三、全局dydmj法dydmj法最突出的优点是收敛速度快,具有局部二次收敛性,但基本dydmj法的初始点必须充分“接近”极小点,否则算法可能无法收敛。 就这样引入了全球dydmj法。 1、全局dydmj法流程给出终止误差值、初始点、命令; 计算,如果是,停止,输出; 要计算并求解线性方程组,请记住这是不满足以下不等式的jadhm的最负整数:然后转2。 2、Armijo搜索全局dydmj方法是基于Armijo的搜索,满足Armijo标准。 给定的、wxddn因子,其中满足以下不等式的最大jadhm负整数:

四、算法实现实验部分用Java实现,是需要优化的函数,最小值为。

1、基本dydmj法Java实现package org.algorithm.Newton method; /** * Newton法* * @ author Dell * */publicclassnewtonmethod { privatedoubleoriginalx; //初始点private double e; //误差阈值private double maxCycle; //最大周期数/** *构建方法* * @param originalX初始值* @param e误差阈值* @param maxCycle最大周期数*/publicnewtonmethod (double eoriginalx this.setmaxcycle(maxcycle ); //一系列get和set方法publicdoublegetoriginalx ({ returnoriginalx; } publicvoidsetoriginalx (doubleoriginalx ) {this.originalX=originalX; }public double getE () {return e; }publicvoidsete(doublee ) ) {this.e=e; }public double getMaxCycle () {return maxCycle; } publicvoidsetmaxcycle (doublemaxcycle ) {this.maxCycle=maxCycle; }/** *原始函数* * @param x变量* @return原始函数的值*/publicdoublegetoriginal (doublex ) ) returnx*x-3*x2; }/** *一阶导数* * @param x变量* @return一阶导数的值*/publicdoublegetonederivative (doublex ) {return 2 * x - 3; }/** *二阶导数* * @param x变量* @return二阶导数的值*/publicdoublegettwoderivative (doublex ) {return 2; }/* *用dy dmj法修改* * @ return */publicdoublegetnewtonmin () {double x=this.getOriginalX ); 双y=0; 双k=1; //更新官方while (k=this.getmaxcycle ) (y=this.getoriginal ) x ); double one=this.getone derivative (x; if(math.ABS(one )=e ) {break; } double two=this.gettwoderivative (x; x=x - one/two; k; }return y; }

2、全局dydmj法Java实现package org.algorithm.Newton method; /** *全球dydmj法* * @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;}/** * 利用dydmj法求解 * * @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("基本dydmj法求解:" + newton.getNewtonMin());GlobalNewtonMethod gNewton = new GlobalNewtonMethod(0, 0.55, 0.4,0.00001, 100);System.out.println("全局dydmj法求解:" + gNewton.getGlobalNewtonMin());}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。