【问题标题】:Implementing a multivariate gaussian probability density function for >2 dimensions in C++在 C++ 中实现大于 2 维的多元高斯概率密度函数
【发布时间】:2011-08-25 11:46:30
【问题描述】:

我正在努力在 C++ 中实现多元高斯的概率密度函数,但我一直在思考如何最好地处理维度 > 2 的情况。

高斯的pdf可以写成

其中 (A)' 或 A' 表示通过从 x 的所有元素中减去平均值创建的“矩阵”的转置。在这个等式中,k 是我们拥有的维数,sigma 表示协方差矩阵,它是一个 k x k 矩阵。最后,|X|表示矩阵 X 的行列式。

在单变量情况下,实现 pdf 是微不足道的。即使在双变量 (k = 2) 的情况下,它也是微不足道的。然而,当我们超越二维时,实现起来就困难得多。

在双变量情况下,我们有

其中 rho 是 x 和 y 之间的相关性,相关性等于

在这种情况下,我可以使用Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> 来实现第一个方程,或者只使用第二个方程自己计算所有内容,而无需受益于 Eigen 的简化线性代数接口。

我对多变量情况的尝试可能会从将上述方程扩展到多变量情况开始

与

我的问题是:

  1. 是否适合/建议使用boost::multi_array n 维数组,还是我应该尝试利用 Eigen?
  2. 我是否应该为单变量/双变量案例设置单独的函数? 或者我应该使用 boost::multi_array(或适当的替代方案)?

【问题讨论】:

  • 哎呀!那么,到目前为止,您尝试了什么? :D
  • 这里合适的回应当然是使用支持矩阵运算的数值库。 uBLAS/LaPack 不提供这个吗?无论如何,使用multi_array(或任何自制的东西)很可能不是一个好主意。

标签: c++ boost statistics eigen


【解决方案1】:

我在这里有点不习惯,但有一些想法:

首先,从编程的角度来看,常用答案是“个人资料”。也就是说,首先以更清晰的方式对其进行编码。然后分析您的执行情况以查看优化是否值得。恕我直言,使用矩阵库更接近原始数学可能更清楚。

从数学角度看:我对您为多变量案例提供的公式有点怀疑。我觉得不合适。表达式 Z 应该是二次形式,而您的 Z 不是。除非我错过了什么。

这是一个您没有提到但可能有意义的选项。特别是如果您要为单个发行版多次评估 PDF。首先计算分布的主成分基础。即 Σ 的特征基。主成分方向是正交的。在主成分基中,互协方差都为 0,所以 PDF 有一个简单的形式。当您要评估时,将输入的基更改为主成分基,然后对其进行更简单的PDF计算。

想法是您可以预先计算一次基矩阵和主成分的变化,然后每次评估只需进行一次矩阵乘法(基数的变化),而不是评估所需的两次矩阵乘法标准基础上的(x-μ)' Σ (x-μ)。

【讨论】:

【解决方案2】:

我已经基本实现了exp-this question 中三维情况等式的部分。我最初使用了一个名为OpenCV 的计算机视觉库。但我注意到 C++ 接口非常慢。后来我尝试了C接口,速度有点快。最后,我决定忽略灵活性和可读性,所以我在没有任何库的情况下实现了它,而且速度更快。

我想说的是:当性能很重要时,您应该考虑以尽可能少的开销为最常用的维数实现特殊情况。否则选择可维护性而不是速度。

免责声明:我对Eigen或boost::multi_array的速度一无所知(这可能是这个问题的真正目标?)。

【讨论】:

    猜你喜欢
    • 2014-04-23
    • 2012-06-06
    • 1970-01-01
    • 2018-12-11
    • 2018-07-18
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    相关资源
    最近更新 更多