码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 学习笔记:机器学习优化算法之牛顿法、拟牛顿法


     活动地址:CSDN21天学习挑战赛

    1 简介

            牛顿法也叫牛顿迭代法,它是一种求根算法,也可以求函数的极小值。它的基本思想是在现有极小点估计值附近对f(x)做二阶泰勒展开,找到下一个极小点,继续迭代的过程。

    2 牛顿法原理

    输入:目标函数f(x),函数梯度为f'(x),计算精度 \varepsilon

    输出:f(x)的零点 x^{*}

    (1)选出初始值x^{(0)},k=0;

    (2)计算f(x^{(k)})和梯度\large \nabla f(x);

    (3)带入迭代公式进行参数更新:             \large x^{(k+1)}=x^{(k)}-\frac{f(x^{k})}{\nabla f(x^{(k)})}

    推导该迭代公式

    设第k次迭代点为\small (x^{(k)},f(x^{(k)})),过该点做曲线的切线,斜率则为\small f'(x^{(k)}),进而可得到切线方程为:

    \large y-f(x^{(k)}))=f'(x^{(k)})(x-x^{(k)})

    接着求该曲线与x轴的交点坐标:

    \large 0=f(x^{(x)})+f'(x^{(k)})(x-x^{(k)})

    则交点的横坐标为新的迭代点的横坐标,整理得:

    \large x^{(k+1)}=x^{(k)}-\frac{f(x^{k})}{\nabla f(x^{(k)})}

    确定迭代次数或者精度;

    (4)如果\large ||f(x^{(k+1)}||<\epsilon,停止迭代,令x^{*}=x^{(k+1)},输出结果;否则继续迭代。

    实验部分:雷神之锤代码计算    \frac{1}{\sqrt{x}}

    1. #include
    2. using namespace std;
    3. //计算 1/((x)^(1/2))
    4. float Q_rsqrt( float number ) {
    5. long i;
    6. float x2, y;
    7. const float threeHalfs = 1.5f;
    8. x2 = number * 0.5f;
    9. y = number;
    10. i = * ( long * ) &y; // evil floating point bit level hacking
    11. i = 0x5f3759df - ( i >> 1 ); // What the fuck?
    12. y = * ( float * ) &i;
    13. y = y * ( threeHalfs - ( x2 * y * y ) ); // 1st iteration
    14. // y = y * ( threeHalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
    15. return y;
    16. }
    17. int main() {
    18. float x1=4;
    19. float x2=2;
    20. float x3=25;
    21. printf("%f",Q_rsqrt(x3));
    22. return 0;
    23. }

    2.1 Hessen矩阵

            Hessen矩阵存储了二阶可导的多元函数的二阶导数,Hessen矩阵可用于多元函数的泰勒展开,一般用H表示 Hessen矩阵。

    上式可简写为:

    f(x)\approx f(x^{(k)})+g_k^T(x-x^{(k)})+\frac{1}{2}(x-x^{(k)})^TH(x^{(k)})(x-x^{(k)}) \qquad \qquad(1)

    其中\large g_k为求导后在第k个迭代点的梯度向量;

    \large H(x^{(k)})表示第k次迭代时的Hessen矩阵

    当f(x)去到最值时,f'(x)=0,令此时的x=k+1(其中x_{k},x^{(k)}意思相同)

    \large \frac{\partial f(x) }{\partial x}=g(x)\approx 0+g(x^{(k)})+\frac{1}{2}\times 2H(x^{(k)})(x-x^{(k)}) \\ =g_k(x^{(k)})+H_k(x-x^{(k)})\quad(2)

    整理后得到x的迭代公式:

    \LARGE x_{k+1}=x_{k}-g_k(x^{(k)})H^{-1}_k

    2.2 拟牛顿法条件

    对(2)式子操作:

    记y_k=g_{k+1}-g_k,x=x^{(k+1)},则:

    \large g_{k+1}-g_k=H_k(x^{(k+1)}-x^{k})

    \large y_k=H_k(x^{(k+1)}-x^{k})

    记\delta_k=x^{(k+1)}-x^{(k)}代入上式得:

     \large y_k=H_k\delta _k

    即                                                                    \large \delta _k=H^{-1}_ky_k                                                            该式为拟牛顿法条件。

            从这里可以看出此时牛顿法需要 计算矩阵的逆,计算会很麻烦,甚至不存在逆矩阵,这样就需要拟牛顿法了。  

    3 拟牛顿法

            拟牛顿法的思想是找到矩阵的逆的替代者,主要有DFP和DFGS方法。

    参考

    (43条消息) 泰勒展开与黑塞矩阵(Hessian Matrix)_老实人小李的博客-CSDN博客_泰勒展开式的矩阵形式

  • 相关阅读:
    Scrum框架中的Sprint
    【Android-Jetpack进阶】6、WorkManager 后台线程、一次性、周期性、任务链的 Work
    java8 新特性4 Stream Api-1
    Java ByteArrayOutputStream.toString()方法具有什么功能呢?
    【Web开发 | Django】数据库分流之道:探索Django多数据库路由最佳实践
    vue或css动画实现列表向上无缝滚动
    【数据结构】顺序表 详解(初始化、增、删、查、改)
    25、ESP8266的AP模式跟Station模式代码实现
    如何让文字变成语音?推荐三个免费把文字变成音频软件
    12年开发大佬,熬夜4个月整理的SpringBoot实战派,绝对涨薪秘籍
  • 原文地址:https://blog.csdn.net/qq_44635691/article/details/126148283
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号