当前位置: 首页 > news >正文

优化方法介绍(一)

优化方法介绍(一)

本博客是一个系列博客,主要是介绍各种优化方法,使用 matlab 实现,包括方法介绍,公式推导和优化过程可视化

1 失败案例介绍

本文在编写最速下降法的时候使用了经典的求解函数框架,并使用了自适应步长(alpha)机制,即加入参数flag,当出现梯度下降的情况(Fnew>F0)时,flag自增一(flag = flag + 1),当flag大于等于其阈值(fthershold)时,才执行对于步长alpha的改变(alpha = alpha * multiplyer)操作。通过对于初始步长(alpha)、参数flag的阈值(fthershold)和步长改变量(multiplyer)这三个变量的循环寻优。

经过实践发现,这三个参数的最优值分别为

alpha = 1e-3
fthershold = 2
multiplyer = 1.7

最终优化之后的迭代次数(函数Rosenbrock被调用的次数)为17次,未经优化时的次数为26次。初始步长alpha的数值如此小的原因本文进行了探讨,通过对于函数设置断点之后本文发现,在使用梯度函数gradient计算梯度g时,由于极小值eps(或者说sqrt(eps))的数值比较小,为1e-8级,由于数值计算的问题会导致初始点在x1方向上的梯度达到1e3级,故需要alpha的数值取得比较小才能中和这种巨大的梯度,使得alpha*p的值在(0,10)之间。

代码包括
LineSearchFrameWork.m 文件,用于优化的函数

function [F0,x0,FE,xhis] = LineSearchFrameWork()
    x0 = [2,2]; %Initial searching point
    tol = 1e-6; %the tolerance value of results
    FE = 0;     %how many times the Rosenbrock function is runned 
    FEmax = 1e5;%maxium interation times
    alpha = 1e-3;  %initial step length
    F0 = Rosenbrock(x0); % initial function value
    flag = 0;            % the determination parameter
    fthers = 2;          % the thershold of the times that gradient goes down
    xhis = [];
    xhis = [xhis; x0];
    while (F0 > tol) && (FE < FEmax)
        g = gradient(x0, F0);
        FE = FE + 2;
        p = -g;
        xnew = x0 + alpha*p;
        Fnew = Rosenbrock(xnew);
        xhis = [xhis; xnew];
        if Fnew < F0
            flag = flag + 1;
            if flag >= fthers
                alpha = alpha * 1.7;
                flag = 0;
            end
        end
        x0 = xnew;
        F0 = Fnew;
    end
end

Rosenbrock.m 文件,用于 罗森布尔克 函数值的计算的函数

function y = Rosenbrock(x)
    y = 100*(x(:, 2) - x(:, 1).^2).^2 + (1 - x(:, 1)).^2;
end

gradient.m 文件,计算梯度值的函数

function g = gradient(x, F0)
    d = sqrt(eps);
    g = (Rosenbrock(x + ones(1, 2)*d) - F0) / d;

runner.m 文件,主运行文件,用于调用其他的函数

clc; clear all; clear

tol = 1e-6;
[F0,x0,FE,xhis] = LineSearchFrameWork();
if F0 < tol
    disp("成功了!!!!");
else
    disp("lose loser");
end
plot(xhis(:, 1), xhis(:, 2), xhis(:, 1), xhis(:, 2),'*')
title('最速下降法求Rosenbrock函数的局部极小值')
xlabel('x_1'); ylabel('x_2');

运行后的优化结果为

寻优次数 x1 值 x2 值
1 2 2
2 0.798 0.798
3 0.817619 0.817619
4 0.850445 0.850445
5 0.881263 0.881263
6 0.928068 0.928068
7 0.961518 0.961518
8 0.995455 0.995455
9 0.999905 0.999905
project cover MATLAB 运行结果1

下面是对于MATLAB中的函数报告(profile):

project cover MATLAB 函数报告1

初次实验之后,博主发现本文采用的方法是错误的,它只能适用于像(2,2)到最优点(1,1)这样的寻优过程,因为在本文的方法中直接将寻优过程初始点为(2,2)的Rosenbrock函数当作一个单值函数来处理,使得x1和x2同增同减,但是这种方法的适用范围非常小,只能在寻优初始点处的x1和x2相等时才能采用。

从上方的图表中可以看出,本文初次实现的方法是有很大问题的,因为本文是通过提前知道了寻优的初始点是x1=x2=2的特殊情况,而寻优的理想结果也是同样的x1=x2=1,所以采用了将Rosenbrock函数作为单值函数来进行寻优的方法。这样的方法其实是没有意义的,因为它有两个局限性:1)只适用于Rosenbrock函数;2)只适用于寻优初始点为x1=x2=2的特殊情况。本文研究Rosenbrock函数是为了使得寻优算法更加具有普适性,即对于尽可能多的函数尤其是一些特殊函数,都能够进行寻优的操作,而本文组的这个方法却是背离了这个初衷,只是为了解决问题而解决问题,这样的研究是没有多少价值的,如同鸡肋。

这个方法发现过程是一个巧合,在编写最速下降法的时候,对于梯度计算函数gradient函数,本来应该使用单位矩阵eye(2)的地方,错误地使用成了全1矩阵ones(1, 2),但是却奇迹般的找到了最优值,在一开始,本文是兴奋的,因为首次实现的结果就如此的成功,但是在后续的检查过程中本文发现,这个方法其实是错误的,本文后续对于这个方法有进行了反思,就有了上面对于这个方法的叙述和讨论。

2 最速下降法求解过程介绍

最速下降法的坐标更新表达式为

<

相关文章:

  • PCIe 5.0光学SSD原型问世!
  • 2025-4-11 情绪周期视角复盘(mini)
  • java -jar与java -cp的区别
  • 操作系统 ------ 五种IO模型
  • 前端工程化-包管理NPM-package.json 和 package-lock.json 详解
  • 小甲鱼第004讲:变量和字符串(下)| 课后测试题及答案
  • Git基础知识
  • 蓝桥杯单片机刷题——ADC测量电位器的电压
  • 基于FPGA的六层电梯智能控制系统 矩阵键盘-数码管 上板仿真均验证通过
  • 深入解析Python爬虫技术:从基础到实战的功能工具开发指南
  • python文件打包无法导入ultralytics模块
  • 4月12日随笔
  • 【区块链安全 | 第三十九篇】合约审计之delegatecall(一)
  • 通信中的 “bps“ 含义及详解
  • linux小白对系统环境变量的一些不解和迷惑解析
  • Python(10.2)Python可变与不可变类型内存机制解密:从底层原理到工程实践
  • C 语言 - 右左法则与实践练习题 答案解析
  • 文档检索技术详解 (Document Retriever)
  • 代码随想录算法训练营第十六天
  • C++、Python的输入输出及相关的处理操作
  • 陕西城乡建设厅网站/临沂网站seo
  • 建站之星导出网站/北京seo
  • 丽江网站开发/友情链接交换网址大全
  • 简述网页的基本结构/安卓优化大师官网
  • 目前提供目录类搜索引擎的网站/企业seo
  • 新乡河南网站建设/百度云官方网站