8

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

高斯的pdf可以写成

多元高斯pdf

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

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

在双变量情况下,我们有

双变量高斯pdf

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

两个随机变量 X 和 Y 之间的相关性

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

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

多元pdf

多元pdf

我的问题是:

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

2 回答 2

1

我有点不在我的元素这里,但有一些想法:

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

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

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

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

于 2011-08-25T12:59:47.133 回答
0

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

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

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

于 2011-08-25T12:58:47.600 回答