在C++中实现> 2维的多元高斯概率密度函数

kmo*_*ore 8 c++ statistics boost eigen

我正在努力在C++中实现多元Gaussian的概率密度函数,并且我坚持如何最好地处理维> 2的情况.

高斯的pdf可以写成

多元高斯pdf

其中(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 boost::multi_array作为n维数组,或者我应该尝试利用Eigen?
  2. 我是否应该为单变量/双变量情况提供单独的函数,还是应该使用boost :: multi_array(或适当的替代方法)将其全部抽象到多变量情况?

Man*_*agu 1

我有点不适应这里,但有一些想法:

\n\n

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

\n\n

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

\n\n

这是您没有提到的一个选项,但可能有意义。特别是如果您要多次评估单个发行版的 PDF。首先计算分布的主成分基础。也就是说,\xce\xa3 的特征基。主成分方向是正交的。在主成分基础上,互协方差全部为0,因此PDF具有简单的形式。当您想要评估时,请将输入的基础更改为主成分基础,然后对其执行更简单的 PDF 计算。

\n\n

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

\n