使用C ++中的最大似然拟合将1000个样本拟合到正态分布

时间:2012-12-07 15:51:01

标签: c++ mathematical-optimization frequency-distribution data-fitting

我有5000个双打的样本,如

  

样本= {1.23,-4.67,0.17,1.25,6.89,-2.03,...}

并希望将数据拟合到参数分布,如N(mu,sigma)或广义学生t(loc,scale,DoF)......

我已经拥有这些发行版的PDF PDF_normal(mu,sigma)(x)和PDF_t(loc,scale,DoF)(x),可以计算固定分布的5000个样本的PDF对数之和参数。

现在,我想使用一些C ++算法来解决非线性优化问题,以找到能够给出最大对数似然值的参数(mu_max,sigma_max)或(loc_max,scale_max,DoF_max)。

统计计算R项目正在通过以下方式解决MASS包中的问题: ..使用optim执行对数似然的直接优化。估计的标准误差取自观察到的信息矩阵,通过数值近似计算。对于一维问题,使用Nelder-Mead方法和BFGS方法的多维问题......

不幸的是,我无法使用R解决方案,但必须在Microsoft VS2010 C ++中提出解决方案,我不想自己编写优化代码,我不想查看R源代码并重写它对于C ++ ......

有什么建议可以为C ++找到快速且经过良好测试的BFGS(或类似)实现吗?

Boost,英特尔MKL等有什么可用的吗?

感谢您的帮助,Matt

2 个答案:

答案 0 :(得分:1)

好的,我不需要对正态分布的MLE进行任何优化,因为它可以以封闭的形式解决,请参阅1http://de.wikipedia.org/wiki/Maximum-Likelihood-Methode

但我想为不同的发行家族解决这个问题,我只知道PDF。因此,我仍然需要一个很好的非线性求解器的C ++实现...

答案 1 :(得分:0)

你提到的发行版都只有很少的参数。直接采用牛顿方法可能更有用。你可以计算出对数似然函数及其梯度和Hessian(关于参数,而不是数据)。

当你在最后解决系统时,你应该使用Cholesky因子分解或L D L T 因子分解而不是高斯消元法。你会知道精度大致为sqrt(机器epsilon)的所有因素,大多数系统都是10 -7 -ish。

一种更稳健的方法来获得Hessian的Cholesky因子分解,如果它是一堆秩一矩阵的总和,就是使用一系列Givens旋转将每个新的秩-1矩阵合并到Cholesky因子分解中。这使得精度接近机器epsilon,但它大约是形成Hessian的两倍,然后以通常的方式采用Cholesky分解。

这里的技术非常简单,您可以自己编写代码。

我很难为您推荐一个通用的软件包。这部分是因为我没有与其他人的C ++优化库有任何积极的经验。但是,大多数情况下,一旦你有了评估渐变和Hessian的代码,编写Newton的方法并不是很有用,所以我并没有真正感受到它的需要。

也就是说,您可能希望查看COIN-OR project提供的内容。您可以使用automatic differentiation工具节省一些时间---(COIN-OR有one)。我想我应该提一下,我从来没有使用过COIN-OR的非线性优化或自动差分工具。