gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:59:47 28 4
gpt4 key购买 nike

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

高斯的pdf可以写成

multivariate gaussian pdf

其中 (A)' 或 A' 表示通过从 x 的所有元素中减去平均值创建的“矩阵”的转置。在这个等式中,k 是我们拥有的维数,sigma 表示协方差矩阵,它是一个 k x 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 的简化线性代数接口(interface)。

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

multivariate pdf

multivariate pdf

我的问题是:

  1. 是否适合/建议使用 boost::multi_array为了n 维数组,还是我应该尝试利用 Eigen?
  2. 我是否应该为单变量/双变量情况设置单独的函数,或者我应该把它全部抽象到多元案例中使用boost::multi_array(或适当的替代方案)?

最佳答案

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

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

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

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

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

关于c++ - 在 C++ 中实现 >2 维的多元高斯概率密度函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7189801/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com