我正在努力在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的简化线性代数接口(interface)。
我对多元案例进行尝试的想法可能始于将上述方程式扩展到多元案例
和
我的问题是:
boost::multi_array
用于n维数组,还是我应该尝试利用特征值?
或者我应该使用以下方法将其全部抽象为多变量情况
boost::multi_array(或适当的替代方法)?
最佳答案
我在这里有点不了解,但有一些想法:
首先,从编程的角度来看,库存答案是“配置文件”。也就是说,首先以更清晰的方式对其进行编码。然后分析您的执行情况,看看是否值得进行优化。恕我直言,使用矩阵库更接近原始数学可能更清晰。
从数学角度来看:对于您为多元案例提供的公式,我有点怀疑。在我看来不对。 Z表达式应为二次形式,而Z则不是。除非我缺少任何东西。
这是您没有提到的选项,但可能有道理。特别是如果您要针对一个发行版多次评估PDF。首先计算您的分配的主成分基础。即,Σ的 Eigen 基。主成分方向是正交的。在主成分基础上,交叉协方差均为0,因此PDF具有简单的形式。当您要评估时,将输入的基础更改为主要成分的基础,然后在此基础上执行更简单的PDF计算。
这样的想法是,您可以预先计算一次基矩阵和主成分的变化,然后每次评估只需执行一次矩阵乘法(基数变化),而不是评估其中的(x-μ)' Σ (x-μ)
所需的两次矩阵乘法。标准依据。