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

时间:2011-08-25 11:46:30

标签: c++ boost statistics eigen

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

高斯的pdf可以写成

multivariate gaussian pdf

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

在单变量案例中,实施pdf是微不足道的。即使在双变量(k = 2)的情况下,它也是微不足道的。但是,当我们超过两个维度时,实施起来会更加艰难。

在双变量情况下,我们有

bivariate gaussian pdf

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

correlation between two random variables X and Y

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

我对尝试多变量案例的想法可能首先将上述等式扩展到多变量案例

multivariate pdf

multivariate pdf

我的问题是:

  1. 是否适合/建议使用boost::multi_array n维数组,或者我应该尝试利用Eigen?
  2. 我是否应该为单变量/双变量情况提供单独的功能, 或者我应该将它全部抽象到使用的多变量情况 boost :: multi_array(或一个合适的替代方案)?

2 个答案:

答案 0 :(得分:1)

我在这里有点偏离我的元素,但有些想法:

首先,从编程视图来看,股票回答是“个人资料”。也就是说,首先将它编码为更清晰的方式。然后分析您的执行情况,看看优化是否值得。恕我直言,使用矩阵库来更接近原始数学可能更清楚。

从数学角度来看:我对你为多变量案例提供的公式有点怀疑。它看起来不对我。表达式 Z 应该是二次形式,而 Z 则不是。除非我遗漏了什么。

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

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

答案 1 :(得分:0)

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

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

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