数学建模常用Matlab/Lingo/c代码总结系列——参数估计

Matlab中用fminsearch实现参数估计


文章的主要思想来源于Matlab|Simulink仿真世界的一篇类似的文章。我这里把这个思想引入到我们的体系来,并以一个新的例子讲解这一用法。

fminsearch用来求解多维无约束的非线性优化问题,它的基本形式是:

[X,FVAL,EXITFLAG,OUTPUT] = FMINSEARCH(FUN,X0,OPTIONS).

大段的Matlab帮助文档我就不翻译解释了,有兴趣的朋友可以参见Matlab联机帮助,我这里只介绍他在参数估计中的作用。

在 参数估计中经常用到正态分布的参数估计。在matlab系统中有一个函数叫做normfit就直接可以完成这样的参数估计,返回均值mu和均方差 sigma的估计,但是这里有一个要求,就是它的输入信息必须是随机的数字序列。如得到1000个服从正态分布的随机数向量R,用命令[phat pci]=normfit(R),就可以得到参数估计了。然而如果我我们得知某些已经处于pdf函数曲线上的点时,这时需要对函数进行拟合运算。

估计参数的原理是从已知的一序列数据中,对于给定的任何一组参数,计算用其估计数据得到的方差,然后利用fminsearch函数求当方差满足最小的时候的参数,这就是需要估计的参数。

来看一下下面的列子:



上面例子中所用的几个函数定义如下:




运行结果如图所示:

数学建模常用Matlab/Lingo/c代码总结系列——参数估计


从图中可以看出,随机数在这里变成了统计信息,统计信息反映到了绘制的点信息上,图中圆圈所示。真实的pdf为红色曲线,估计的曲线为蓝色虚线。从图中可知,估计的效果非常满意。

如果在函数中加上:



得到结果:



与真实值相比,我们这里的拟合结果将比直接用normfit的结果更接近真实值。

可 以这么解释:normfit函数是内部通用的拟合函数,适合范围广,而没有任何先验信息加入,而对于我们的fminsearch函数来说,它需要一个先验信息,即参数的初值。我们在调用的时候用了初值8,20.这个先验信息对更进一步的拟合最后的结果有着相当重要的作用!因此,对于参数估计,先验信息还是相当重要的。

由于有这种技巧存在,了解了fminsearch函数之后,可以有很多的扩展应用。

你可能感兴趣的:(matlab)