-
-
-
论文研究-基于级差格式的GM(2,1)模型参数估计优化研究.pdf
2019-09-20 20:55:03针对这些问题,本文基于GM(2,1)模型微分方程的时间响应函数推导了级差格式,给出了最小二乘法的参数估计方法,然后基于原始序列误差平方和最小的目标函数,优化了模型的两个初始条件,同时,推导出GM(1,1)回归... -
Ceres Solver 官方教程学习笔记(七)——解析微分法Analytic Derivatives
2018-04-04 20:05:00这篇文章翻译自官方教程...我们来思考一个相对复杂的曲线拟合问题。待确定参数方程如下: y=b1(1+eb2−b3x)1/b4y=b1(1+eb2−b3x)1/b4y = \frac{b_1}{(1+e^{b_2-b_3x})^{1/b_4}} 现在给定一系列的对应数据点{xi,y...这篇文章翻译自官方教程Analytic Derivatives并且参考了少年的此间的博客文章Ceres-Solver学习笔记(5)
我们来思考一个相对复杂的曲线拟合问题。待确定参数方程如下:
y=b1(1+eb2−b3x)1/b4y=b1(1+eb2−b3x)1/b4现在给定一系列的对应数据点{xi,yi}, ∀i=1,...,n{xi,yi}, ∀i=1,...,n。我们面临的问题就是求解b1,b2,b3,b4b1,b2,b3,b4使下列表达式的取值最小:
E(b1,b2,b3,b4)=∑if2(b1,b2,b3,b4;xi,yi)=∑i(b1(1+eb2−b3xi)1/b4−yi)2(7)(8)(7)E(b1,b2,b3,b4)=∑if2(b1,b2,b3,b4;xi,yi)(8)=∑i(b1(1+eb2−b3xi)1/b4−yi)2根据高等数学中微积分的知识,我们可以算出ff的一系列导数:
D1f(b1,b2,b3,b4;x,y)D2f(b1,b2,b3,b4;x,y)D3f(b1,b2,b3,b4;x,y)D4f(b1,b2,b3,b4;x,y)=1(1+eb2−b3x)1/b4=−b1eb2−b3xb4(1+eb2−b3x)1/b4+1=b1xeb2−b3xb4(1+eb2−b3x)1/b4+1=b1log(1+eb2−b3x)b24(1+eb2−b3x)1/b4(9)(10)(11)(12)(9)D1f(b1,b2,b3,b4;x,y)=1(1+eb2−b3x)1/b4(10)D2f(b1,b2,b3,b4;x,y)=−b1eb2−b3xb4(1+eb2−b3x)1/b4+1(11)D3f(b1,b2,b3,b4;x,y)=b1xeb2−b3xb4(1+eb2−b3x)1/b4+1(12)D4f(b1,b2,b3,b4;x,y)=b1log(1+eb2−b3x)b42(1+eb2−b3x)1/b4根据这些计算出的导数,我们可以手动实现
CostFunction
如下:class Rat43Analytic : public SizedCostFunction<1,4> { public: Rat43Analytic(const double x, const double y) : x_(x), y_(y) {} virtual ~Rat43Analytic() {} virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const { const double b1 = parameters[0][0]; const double b2 = parameters[0][1]; const double b3 = parameters[0][2]; const double b4 = parameters[0][3]; residuals[0] = b1 * pow(1 + exp(b2 - b3 * x_), -1.0 / b4) - y_; if (!jacobians) return true; double* jacobian = jacobians[0]; if (!jacobian) return true; jacobian[0] = pow(1 + exp(b2 - b3 * x_), -1.0 / b4); jacobian[1] = -b1 * exp(b2 - b3 * x_) * pow(1 + exp(b2 - b3 * x_), -1.0 / b4 - 1) / b4; jacobian[2] = x_ * b1 * exp(b2 - b3 * x_) * pow(1 + exp(b2 - b3 * x_), -1.0 / b4 - 1) / b4; jacobian[3] = b1 * log(1 + exp(b2 - b3 * x_)) * pow(1 + exp(b2 - b3 * x_), -1.0 / b4) / (b4 * b4); return true; } private: const double x_; const double y_; };
在实际操作中,我们会缓存一些子表达式来提高效率,从而避免重复计算:
//增加子表达式缓存 const double t1 = exp(b2 - b3 * x_); const double t2 = 1 + t1; const double t3 = pow(t2, -1.0 / b4); residuals[0] = b1 * t3 - y_; if (!jacobians) return true; double* jacobian = jacobians[0]; if (!jacobian) return true; //借由子表达式减少计算冗余 const double t4 = pow(t2, -1.0 / b4 - 1); jacobian[0] = t3; jacobian[1] = -b1 * t1 * t4 / b4; jacobian[2] = -x_ * jacobian[1]; jacobian[3] = b1 * log(t2) * t3 / (b4 * b4); return true;
$$
经过这一小小的优化,效率得到很大改善。时间从255 ns减少到92 ns。
什么时候应该使用analytical derivatives?
- 表达式很简单,例如大部分是线性的
- 计算机代数系统像 Maple , Mathematica, 或者SymPy可以被用来对目标函数进行符号化的微分。
- 式子中有一些代数结构可以实现比自动微分有更好的性能。
也就是说, 获得在计算倒数之外的最大性能需要大量的工作.在沿着这条路径走下去之前,评估雅可比矩阵的计算花费是整个求解时间的一小部分是很有用的,,记住Amdahl法则是你的朋友。 - 没有其他的方法来计算这些导数,比如你想计算多项式的根的导数: a3(x,y)z3+a2(x,y)z2+a1(x,y)z+a0(x,y)=0a3(x,y)z3+a2(x,y)z2+a1(x,y)z+a0(x,y)=0
对于x,y.这需要用到逆函数理论。 - 你愿意亲自来做导数计算。
-
-
-
数学建模--回归与预测
2014-05-06 21:46:07简单的微分方程模型在精度上难以满足要求,复杂的微分方程在确定参数,求解时,都面临较大困难。 插值与拟合 (小样本内部预测) 回归模型 (大样本内部预测) 灰色预测方法通常用于数据不足或者缺失的情况。 ...//2014年5月6日
回归与预测是数学建模的一大类问题。其主要思路有基于模型和基于数据两大类。
基于模型:
即利用先验知识建立模型,再用模型 learn 这些数据,得出参数。
1)微分方程模型。
2)如bayes网络,马尔科夫链,条件随机场,HMM等
3)其他模型
基于数据:
插值与拟合 回归模型 灰色预测 模糊评价 时间序列 神经网络 小样本内部预测 大样本内部预测 小样本未来预测 定性,定量结合 较长时间的数据,大样本的随机因素或周期特征未来预测 大样本未来预测 拟合:
compertz曲线 与 修正指数曲线 与 logistic曲线
灰色预测方法:
通常用于数据不足或者缺失的情况。
时间序列:
(如果在预测时间范围以内,无突然变动且随机变动的方差较小,并且有理由认为过去和现在的演变趋势将继续发展到未来,可用一些经验方法继续预测)
(当时间序列的数值由于受周期变动和不规则变动的影响,起伏较大,不易显示出发展趋势时,可用移动平均法,消除这些因素的影响,预测序列的长期趋势)
(用移动平均法作为预测值,关于N的取值,应比较若干,选取误差最小者)
(趋势移动法:做二次移动平均,防止当序列直线增加减少时出现的滞后偏差。另外它可以分离出直线趋势与周期波动)
(指数平滑法:解决高次移动平均法不能保证权数合理性的问题)
(机器学习,参数选择,自适应滤波)
(分段时序模型例子:修正指数曲线的三合法,)
(compertz曲线 与 修正指数曲线 与 logistic曲线 的检验法)
(对序列进行平稳时间序列 验证 ,如此可用 ARMA 模型)
(平常遇到的序列,可用box-jenkins方法,消除趋势性,季节性,变换成平稳序列)
(得出模型后应用 卡方检验 检验)
神经网络方法:
得到的结果难以保证全局最优,而且对变量之间的关系难以做深入分析与讨论。
国赛题目:
2005A:
作者认为长江水质具有很强的随机性,其变化态势与现在某一状态有关,在没有大规模意外事件发生的情况下可以认为是一个平稳过程。用马尔科夫过程理论模型。为了深入分析长江总流量与总废水量的关系,作者建立了自滑动回归模型,进行预测。
2006B:
简单的微分方程模型在精度上难以满足要求,复杂的微分方程在确定参数,求解时,都面临较大困难。
用全部数据拟合一个模型,用每个病人的数据拟合一个模型并在此基础上估计总体情况,建立分段时序模型都是可行的解决方案。能够发现数据反映出来的特征并给以合理考虑,建立多种模型并互相比较,验证的论文更好一些。 -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
收藏数
76
精华内容
30
-
一个手动管理spark streaming集成kafka时的偏移量到zookeeper中的小项目
-
EXKMP
-
智能停车场云平台(附vue+SpringBoot前后端项目源码)
-
NFS 网络文件系统
-
UV5R_VIP.rar
-
JAVA基础1---JAVA环境搭建
-
MySQL 高可用(DRBD + heartbeat)
-
3.10解决发布乱码问题
-
MySQL Router 实现高可用、负载均衡、读写分离
-
项目管理工具与方法
-
正则表达式中特殊符号及代表的含义
-
QtWidgets相关的技术分享
-
树莓派4b安装windows资源包.zip
-
ArrayList与LinkedList可以进行数据类型转换吗?
-
京东扫码登陆python脚本.rar
-
SpringCloud概述
-
C++实现归并排序
-
NodeMCU-ESP32开发实例-扫描可用WiFi网络及WiFi信号强度检测
-
数据结构——指针和数组.md
-
DOS命令:label