随手笔记——如何手写高斯牛顿法

这篇具有很好参考价值的文章主要介绍了随手笔记——如何手写高斯牛顿法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

将演示如何手写高斯牛顿法随手笔记——如何手写高斯牛顿法,SLAM,笔记

源代码

#include <iostream>
#include <chrono>
#include <opencv2/opencv.hpp>
#include <Eigen/Core>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

int main(int argc, char **argv) {
  double ar = 1.0, br = 2.0, cr = 1.0;         // 真实参数值
  double ae = 2.0, be = -1.0, ce = 5.0;        // 估计参数值
  int N = 100;                                 // 数据点
  double w_sigma = 1.0;                        // 噪声Sigma值
  double inv_sigma = 1.0 / w_sigma;
  cv::RNG rng;                                 // OpenCV随机数产生器

  vector<double> x_data, y_data;      // 数据
  for (int i = 0; i < N; i++) {
    double x = i / 100.0;
    x_data.push_back(x);
    y_data.push_back(exp(ar * x * x + br * x + cr) + rng.gaussian(w_sigma * w_sigma));
  }

  // 开始Gauss-Newton迭代
  int iterations = 100;    // 迭代次数
  double cost = 0, lastCost = 0;  // 本次迭代的cost和上一次迭代的cost

  chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
  for (int iter = 0; iter < iterations; iter++) {

    Matrix3d H = Matrix3d::Zero();             // Hessian = J^T W^{-1} J in Gauss-Newton
    Vector3d b = Vector3d::Zero();             // bias
    cost = 0;

    for (int i = 0; i < N; i++) {
      double xi = x_data[i], yi = y_data[i];  // 第i个数据点
      double error = yi - exp(ae * xi * xi + be * xi + ce);
      Vector3d J; // 雅可比矩阵
      J[0] = -xi * xi * exp(ae * xi * xi + be * xi + ce);  // de/da
      J[1] = -xi * exp(ae * xi * xi + be * xi + ce);  // de/db
      J[2] = -exp(ae * xi * xi + be * xi + ce);  // de/dc

      H += inv_sigma * inv_sigma * J * J.transpose();
      b += -inv_sigma * inv_sigma * error * J;

      cost += error * error;
    }

    // 求解线性方程 Hx=b
    Vector3d dx = H.ldlt().solve(b);
    if (isnan(dx[0])) {
      cout << "result is nan!" << endl;
      break;
    }

    if (iter > 0 && cost >= lastCost) {
      cout << "cost: " << cost << ">= last cost: " << lastCost << ", break." << endl;
      break;
    }

    ae += dx[0];
    be += dx[1];
    ce += dx[2];

    lastCost = cost;

    cout << "total cost: " << cost << ", \t\tupdate: " << dx.transpose() <<
         "\t\testimated params: " << ae << "," << be << "," << ce << endl;
  }

  chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
  chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);
  cout << "solve time cost = " << time_used.count() << " seconds. " << endl;

  cout << "estimated abc = " << ae << ", " << be << ", " << ce << endl;
  return 0;
}

注:
该部分仅用于学习使用,如有侵权,请联系!文章来源地址https://www.toymoban.com/news/detail-585940.html

到了这里,关于随手笔记——如何手写高斯牛顿法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习笔记之优化算法(二十)牛顿法与正则化

    本节我们介绍 经典牛顿法 在训练 神经网络 过程中的迭代步骤,并介绍 正则化 在牛顿法中的使用逻辑。 经典牛顿法 自身是一个典型的 线搜索方法 ( Line-Search Method ) (text{Line-Search Method}) ( Line-Search Method ) 。它的迭代过程使用 数学符号 表示如下: x k + 1 = x k + α k ⋅ P k x_

    2024年02月11日
    浏览(32)
  • 机器学习笔记之优化算法(十九)经典牛顿法的收敛性分析

    上一节整体介绍了 经典牛顿法 ,并讨论了其更新方向 P k mathcal P_k P k ​ 是否为 下降方向 。本节将对 经典牛顿法 在迭代过程中的收敛性 进行分析。 在这些迭代算法中,我们关注的重点在于 算法在迭代过程中 是否收敛 ,以及它的 收敛速度 。 Wolfe text{Wolfe} Wolfe 准则的收

    2024年02月11日
    浏览(30)
  • 牛顿法及Python实现

    目录 1 原理 2 牛顿法求解步骤 3 牛顿法的几何解释 4 案例Python实现 牛顿法是基于泰勒公式来实现的。泰勒公式的意义:如果函数满足一定的条件,泰勒公式可以用函数在某一点的各阶导数值做系数构建一个多项式来近似表达这个函数。 设在某邻域内n+1阶可导,则的泰勒展开

    2024年02月06日
    浏览(22)
  • 牛顿法(牛顿拉夫逊)配电网潮流计算matlab程序

    牛顿法配电网潮流计算matlab程序 传统牛顿—拉夫逊算法,简称牛顿法,是将潮流计算方程组F(X)=0,进行泰勒展开。因泰勒展开有许多高阶项,而高阶项级数部分对计算结果影响很小,当忽略一阶以上部分时,可以简化对方程的求解计算。当忽略一阶以上部分后,牛顿法的求解

    2024年02月02日
    浏览(26)
  • 牛顿法、割线法、二分法

    牛顿法求解非线性方程组 割线法求解非线性方程组 二分法求解根号3  另外,今天上机课写程序时,发现不同的起始点可以收敛到不同的零点。也许这是一个新的值得研究的地方。 看来,计算数学也是这样,光听理论无法实现大的突破,也没法产生好的想法,必须在实践应用

    2024年02月05日
    浏览(41)
  • 在Python中使用牛顿法

    牛顿法简介 牛顿法(Newton’s method)是一种常用的优化算法,在机器学习中被广泛应用于求解函数的最小值。其基本思想是利用二次泰勒展开将目标函数近似为一个二次函数,并用该二次函数来指导搜索方向和步长的选择。 牛顿法需要计算目标函数的一阶导数和二阶导数,因

    2023年04月23日
    浏览(19)
  • 人工智能之数学基础【牛顿法】

    简述 牛顿法常用来求解无约束非线性规划问题,它利用目标函数的二次泰勒展开式构造搜索方向。 无约束非线性规划问题 : m i n f ( x ) , x ∈ R n min f(x),quad x in R^n min f ( x ) , x ∈ R n 。如果目标函数 f ( x ) f(x) f ( x ) 在 R n R^n R n 上具有 连续的二阶偏导数 ,其中 Hessian矩阵正定

    2024年02月20日
    浏览(32)
  • 最优化方法-牛顿法一维搜索

    导言: 在最优化问题中,找到函数的最小值或最大值是一个重要的任务。牛顿法是一种经典的迭代方法,常用于优化问题的求解。本文将详细介绍最优化方法中的牛顿法一维搜索,包括其基本原理、算法步骤以及应用场景。 牛顿法,也称为牛顿-拉夫逊方法,是一种迭代的优

    2024年02月06日
    浏览(26)
  • 机械臂运动学逆解(牛顿法)

      常用的工业6轴机械臂采用6轴串联结构,虽然其运动学正解比较容易,但是其运动学逆解非常复杂,其逆解的方程组高度非线性,且难以化简。   由于计算机技术的发展,依靠其强大的算力,可以通过数值解的方式对机械臂的运动学逆解方程组进行求解。以下将使用牛

    2024年01月22日
    浏览(33)
  • 【最优化理论】牛顿法+Matlab代码实现

    牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。 多数方程不存在求根公式,因此求精确根非常困难,甚至不可解,从而寻找方程的近似根就显得特别重要。方法使用

    2023年04月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包