Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为>;2个尺寸单位为C++; 我正在研究C++中多元高斯的概率密度函数,我一直在研究如何最好地处理维数>2的情况。_C++_Boost_Statistics_Eigen - Fatal编程技术网

为>;2个尺寸单位为C++; 我正在研究C++中多元高斯的概率密度函数,我一直在研究如何最好地处理维数>2的情况。

为>;2个尺寸单位为C++; 我正在研究C++中多元高斯的概率密度函数,我一直在研究如何最好地处理维数>2的情况。,c++,boost,statistics,eigen,C++,Boost,Statistics,Eigen,高斯函数的pdf可以写成 其中(A)“或A”表示通过从x的所有元素中减去平均值而创建的“矩阵”的转置。在这个方程中,k是我们的维数,sigma表示协方差矩阵,它是kxk矩阵。最后,| X |表示矩阵X的行列式 在单变量情况下,实现pdf非常简单。即使在二元(k=2)的情况下,它也是微不足道的。然而,当我们超越两个维度时,实现就困难多了 在双变量的情况下,我们会 式中,rho是x和y之间的相关性,相关性等于 在这种情况下,我可以使用Eigen::Matrix来实现第一个方程,或者自己使用第二

高斯函数的pdf可以写成

其中(A)“或A”表示通过从x的所有元素中减去平均值而创建的“矩阵”的转置。在这个方程中,k是我们的维数,sigma表示协方差矩阵,它是kxk矩阵。最后,| X |表示矩阵X的行列式

在单变量情况下,实现pdf非常简单。即使在二元(k=2)的情况下,它也是微不足道的。然而,当我们超越两个维度时,实现就困难多了

在双变量的情况下,我们会

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

在这种情况下,我可以使用
Eigen::Matrix
来实现第一个方程,或者自己使用第二个方程来计算一切,而不必受益于Eigen的简化线性代数接口

我对尝试多元情况的想法可能会从将上述方程推广到多元情况开始

我的问题是:

  • 是否适合/建议使用
    boost::multi_数组作为
    n维数组,还是我应该尝试利用特征值
    
  • 对于单变量/双变量情况,我是否应该有单独的函数, 或者我应该把它全部抽象到多元情况下使用 boost::multi_阵列(或适当的替代方案)

  • 我已经基本上实现了exp
    ——中三维情况方程的一部分。起初,我使用了一个名为的计算机视觉库。但是我注意到C++接口非常慢。后来我尝试了C接口,速度快了一点。最后,我决定忽略灵活性和可读性,所以我在没有任何库的情况下实现了它,而且速度更快

    我想说的是:当性能很重要的时候,你应该考虑为尽可能多的维度实现特殊情况,尽可能少的开销。否则,选择可维护性而不是速度


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

    我在这里有点不知所措,但有一些想法:

    首先,从编程的角度来看,股票的答案是“profile”。也就是说,首先以更清晰的方式编写代码。然后分析您的执行情况,看看优化是否值得。我认为使用矩阵库来保持更接近原始数学可能更清晰

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

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


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

    Oof!那么,到目前为止你都试了些什么当然,这里适当的回答是使用支持矩阵运算的数字库。uBLAS/LaPack不提供这一点吗?无论如何,使用
    多数组(或任何自制的)很可能不是一个好主意。换句话说,将二次形式
    (x-μ)∑(x-μ)
    转换为对角形式(la),并在适当的基础上进行评估。