如何在 C++(或其他语言)中以计算方式实现 GLM?

机器算法验证 回归 物流 广义线性模型 C++
2022-04-09 06:31:45

我想在 C++ 中为商业包实现 GLM 模型(即,这不是为了好玩),包括但不限于正态分布、二项分布等。我不太确定实现应该如何工作。比如说,我想在 GLM 框架中实现线性和逻辑模型。

我可以通过求解以下 OLS 系数的矩阵方程来简单地实现线性模型:

在此处输入图像描述

但我需要迭代估计逻辑模型的 MLE 系数。

对我来说,实现将类似于:

if (normal in the exponential family)
{
   solve the matrix equation listed above
}
else if (logistic in the exponential family)
{
   iteratively solve the logistic MLE coefficients
}
else if (poisson in the ....)
{
   iteratively solve the poisson MLE coefficients
}
else (.....)
{
   other error distributions...
}

GLM 为我们提供了一种概括分布模型的数学方法,但它在计算上没有帮助这就像将不同模型的遥远家族粘合成一个模型。

统计软件如何实现 GLM 模型?是否有任何开源统计库(不一定在 C++ 中)显示如何做到这一点?是否有任何资源(文章、论文、书籍)展示了 GLM 模型的编写方式?

GLM 模型为我们提供了如何在计算上对族进行泛化?我们是否应该为每个家庭独立编写一个实现?

1个回答

虽然重新实施 GLM 框架(或任何其他统计框架,就此而言)肯定具有一定的 教育价值,但由于复杂性以及所涉及的时间和精力,我质疑这种方法的可行性。话虽如此,如果您确实想走这条路查看现有的开源GLM 实现,您至少有以下选择:

  • R按包的标准 GLM 实现stats在 GitHub 上查看相应的源代码,或者在R的命令行中输入函数名称(不带括号) 。

  • 替代和特定的 GLM 实现R包括以下包:glm2glmnet和其他一些。此外,此博客文章R中还列出了与GLM 相关的软件包

  • 优秀的GLM Notes网页(由 Michael Kane 和 Bryan W. Lewis 撰写)提供了关于标准和替代RGLM 实现方面的大量有趣和有用的细节。

  • 对于 Julia GLM 实现,检查类似于RGLMGLMNet包。

  • 对于 Python GLM 实现,检查库中的一个和库的一个(实现 Ridge、OLS 和 Lasso - 找到相应的模块)。statsmodelsscikit-learn

  • 对于 .NET GLM 实现,请查看 IMHO 非常有趣的Accord.NET 框架- GLM 源代码在 GitHub 上

  • 对于 C/C++ GLM 实现,请检查apopheniaC 库(此源代码似乎是相关的),也许还有 C++ GNU Scientific Library (GSL)(请参阅此 GitHub 存储库,但我无法找到相关的源代码)。还可能感兴趣的是:这个 C++ IRLS GLM 实现(它使用 GSL)以及贝叶斯面向对象建模 (BOOM) C++ 库(GLM-focused 源代码在 GitHub 上)。