1

我有5000个双打样本

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

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

我已经有了这些分布 PDF_normal(mu, sigma)(x) 和 PDF_t(loc, scale, DoF)(x) 的 PDF,并且可以计算固定分布参数的 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、Intel MKL 等有什么可用的吗?

谢谢你的帮助,马特

4

2 回答 2

1

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

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

于 2012-12-07T16:40:42.727 回答
0

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

最后求解系统时,应使用 Cholesky 因式分解或 LDL T因式分解而不是高斯消元法。您将大致了解 sqrt(machine epsilon) 的所有因素,在大多数系统上为 10 -7 -ish。

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

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

我很难为你推荐一个通用的软件包。这部分是因为我对其他人的 C++ 优化库没有任何积极的经验。不过,大多数情况下,一旦你有了代码来评估梯度和 Hessian,编写牛顿的方法就没什么工作了,所以我真的觉得没有必要。

也就是说,您可能想看看COIN-OR 项目必须提供什么。您也许可以使用自动微分工具来节省一些时间 ---(COIN-OR 有一个)。我想我应该提一下,我自己从未使用过 COIN-OR 的非线性优化工具或自动微分工具。

于 2012-12-07T16:48:19.500 回答