我正在努力在C ++中实现多元Gaussian的概率密度函数,并且我坚持如何最好地处理尺寸>的情况。 2。
高斯的pdf可以写成
其中(A)'或A'表示通过从x的所有元素中减去均值而创建的'矩阵'的转置。在该等式中,k是我们具有的维数,sigma表示协方差矩阵,其是k×k矩阵。最后,| X |表示矩阵X的行列式。
在单变量案例中,实施pdf是微不足道的。即使在双变量(k = 2)的情况下,它也是微不足道的。但是,当我们超过两个维度时,实施起来会更加艰难。
在双变量情况下,我们有
其中rho是x和y之间的相关性,相关性等于
在这种情况下,我可以使用Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
来实现第一个等式,或者只使用第二个等式自己计算所有内容,而不会受益于Eigen的简化线性代数接口。
我对尝试多变量案例的想法可能首先将上述等式扩展到多变量案例
与
我的问题是:
boost::multi_array
n维数组,或者我应该尝试利用Eigen? 答案 0 :(得分:1)
我在这里有点偏离我的元素,但有些想法:
首先,从编程视图来看,股票回答是“个人资料”。也就是说,首先将它编码为更清晰的方式。然后分析您的执行情况,看看优化是否值得。恕我直言,使用矩阵库来更接近原始数学可能更清楚。
从数学角度来看:我对你为多变量案例提供的公式有点怀疑。它看起来不对我。表达式 Z 应该是二次形式,而 Z 则不是。除非我遗漏了什么。
这是你没有提到的选项,但可能有意义。特别是如果您要为单个发行版多次评估PDF。首先计算您的分布的主要组成部分。也就是说,Σ的特征基础。主成分方向是正交的。在主成分基础上,交叉协方差都是0,因此PDF具有简单的形式。当您想要评估时,将输入的基础更改为主要组件基础,然后对其执行更简单的PDF计算。
这个想法是你可以预先计算基础矩阵和主成分的变化,然后每次评估只需要进行单个矩阵乘法(基础的变化),而不是评估所需的两个矩阵乘法标准基础中的(x-μ)' Σ (x-μ)
。
答案 1 :(得分:0)
我基本上实现了exp
- this question中三维情况的等式的一部分。我首先使用了一个名为OpenCV的计算机视觉库。但我注意到C ++界面非常慢。之后我尝试了C接口,这有点快。最后,我决定忽略灵活性和可读性,所以我在没有任何库的情况下实现它,而且速度更快。
我想说的是:当性能很重要时,您应该考虑以尽可能少的开销为最常用的维度实现特殊情况。否则选择可维护性超速。
免责声明:我对Eigen
或boost::multi_array
的速度一无所知(这可能是这个问题的真正目标?)。