zoukankan      html  css  js  c++  java
  • 看牛顿法的改进与验证局部收敛

    看牛顿法的改进

    今天继续看Numerical Optimization这本书,在看第六章,实用牛顿法。

    6.1 提到“不准确”的牛顿法。意思是每次确定迭代方向都要解方程,很慢,实际上也不一定要解出非常精确的迭代方向。于是尝试用一些迭代解法(例如,共轭梯度法)去解 H*x + G = 0这个方程。

    6.2 提到通过共轭梯度法解 Ax = b 找搜索方向p = x的具体做法。

    一旦发现一个点x有 x^T * A * x <= 0此时A非正定,若当前为第一次迭代,以此迭代方向更新牛顿法,否则,以上一次迭代方向更新。前一种情况实际等价于最速下降法。

    初始位置x0可以设置为0,也可以设置为上一帧的搜索方向。两种方法差不多。

    此法不需要显式的H(共轭梯度法每次更新迭代方向需要的都只是H*某个向量),只需要H * p。因此节省了计算H的时间。

    具体的修改方法有:修改Cholesky分解,Gershgorin修改,对称不定矩阵修改。具体的算法以后研究。

    验证局部收敛

    当前想解决的问题是,完全证实之前迭代失败是由于收敛到局部极值。

    想到的具体做法是,对于之前的例子,把有方向和无方向参数的迭代结果分别记录下来,以后在有方向参数的情形下,看看在无方向的解附近,牛顿迭代是否能够收敛。

    经过试验,确定牛顿法确实收敛到局部极值。具体做法是,在有方向参数的迭代过程中,加载无方向参数最终的迭代结果,看迭代是否收敛到无方向的结果。

    有方向的收敛函数值为231.68。

    加载无方向结果后,收敛函数值为111.98,与无方向参数的模拟方法收敛值一样。

    说明在有方向参数的情况下,231.68并不是全局最小值。

    出现收敛到局部极值的原因为变量太多。下一步尝试不再求解内部点的位置(用外部点的权重表示),或把内部点的位置按静态平衡条件解算,不考虑加速度。

  • 相关阅读:
    康复计划
    Leetcode 08.02 迷路的机器人 缓存加回溯
    Leetcode 38 外观数列
    Leetcode 801 使序列递增的最小交换次数
    Leetcode 1143 最长公共子序列
    Leetcode 11 盛水最多的容器 贪心算法
    Leetcode 1186 删除一次得到子数组最大和
    Leetcode 300 最长上升子序列
    Leetcode95 不同的二叉搜索树II 精致的分治
    Leetcode 1367 二叉树中的列表 DFS
  • 原文地址:https://www.cnblogs.com/dydx/p/4228286.html
Copyright © 2011-2022 走看看