IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 高斯牛顿法非线性优化 -> 正文阅读

[数据结构与算法]高斯牛顿法非线性优化

  1. 手写高斯牛顿
    原理看十四讲第6讲
    #include<iostream>
    #include<eigen3/Eigen/Core>
    #include<eigen3/Eigen/Dense>
    #include<opencv2/opencv.hpp>
    #include<vector>
    
    using namespace std;
    
    int main(int argc,char** argv)
    {
        /**
         * y = exp(ax^2 + bx + c) + w
         * 带有噪声 w - N(0,1^2)
         * 误差项 e = y-exp(ax^2 + bx + c)
         * */
        //真实参数
        double ar=1,br=2,cr=1;
        //初始估计值,很重要,有可能收敛到局部极小值
        double ae=2,be=-1,ce=5;
        //随机数产生
        cv::RNG rng;
    
        //生成样本 100个 
        int num=100;  
        //相当与100个方程,3个未知数,所以要最小二乘法
        vector<double> X, Y;
        for(int i=0;i<num;i++)
        {
            double x = i*(1.0/100);
            double y = exp(ar*x*x+br*x+cr) + rng.gaussian(1.0);
            X.push_back(x);
            Y.push_back(y);
        }
    
        double cost=0, lastcost=0;
        //跌代
        for(int iter=0;iter<100;iter++)
        {
            Eigen::Matrix<double,3,3> H = Eigen::Matrix<double,3,3>::Zero();
            Eigen::Matrix<double,3,1> g = Eigen::Matrix<double,3,1>::Zero();
            Eigen::Matrix<double,3,1> dx;
            cost = 0;///重要,别忘了,先重置为0
            double err=0;
            for(int i=0;i<num;i++)
            {
                double x=X[i];
                double y=Y[i];
                Eigen::Matrix<double,3,1> J = Eigen::Matrix<double,3,1>::Zero();  //雅可比矩阵
                /** J =d(e)/d(a,b,c) 对要求的量(a,b,c)求导
                 * J[0]  -x*x*exp(a*x*x+b*x+c)
                 * J[1] -x*exp(a*x*x+b*x+c)
                 * J[2] -exp(a*x*x+b*x+c)
                 * */
                J[0] = -x*x*exp(ae*x*x+be*x+ce);
                J[1] = -x*exp(ae*x*x+be*x+ce);
                J[2] = -exp(ae*x*x+be*x+ce);
                err = y-exp(ae*x*x+be*x+ce);
    
                H+=J*J.transpose();  //!!!!! 若干样本的 H 累加起来
                g+=-J*err;     //!!!!! 若干样本的 g 累加起来
                cost+=err*err;
            }
            dx=H.inverse()*g;
            if(iter>0&&cost>=lastcost)
            {
                cout<<"迭代次数: "<<iter<<endl;
                cout<<"cost = "<<lastcost<<endl;
                cout<<"a = "<<ae<<"\tb = "<<be<<"\tc = "<<ce<<endl;
                break;
            }
            cout<<"cost = "<<cost<<"\ta = "<<ae<<"\tb = "<<be<<"\tc = "<<ce<<endl;
            //更新估计量
            ae+=dx[0];be+=dx[1];ce+=dx[2];
            
            lastcost=cost;
        }
    
    }
    
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:50:35  更:2022-03-30 18:53:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:58:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码