Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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
Numpy 大高斯分布的稳定抽样_Numpy_Eigen_Gaussian - Fatal编程技术网

Numpy 大高斯分布的稳定抽样

Numpy 大高斯分布的稳定抽样,numpy,eigen,gaussian,Numpy,Eigen,Gaussian,我试图对协方差矩阵p的高斯分布进行采样,即NbyN,其中N非常大(约4000) 通常人们会这样做: 计算P:L的Cholesky分解,从而L*L.T=P 对正态高斯分布进行抽样:X~N(0,I_N),其中I_N是恒等式,N=4000 从Y=L*X 这里的障碍是计算L。由于计算的Cholesky分解不满足L*L.T!=P 在计算其Cholesky分解(除以其最大值)之前,我尝试对p进行规范化,但没有成功。我使用C++库Eigen,我也注意到这个问题,NuPy也。 有什么建议吗?如果输入矩阵实际上是

我试图对协方差矩阵
p
的高斯分布进行采样,即
N
by
N
,其中
N
非常大(约4000)

通常人们会这样做:

  • 计算
    P
    L
    的Cholesky分解,从而
    L*L.T=P
  • 对正态高斯分布进行抽样:
    X~N(0,I_N)
    ,其中
    I_N
    是恒等式,
    N=4000
  • Y=L*X
  • 这里的障碍是计算
    L
    。由于计算的Cholesky分解不满足
    L*L.T!=P

    在计算其Cholesky分解(除以其最大值)之前,我尝试对
    p
    进行规范化,但没有成功。我使用C++库Eigen,我也注意到这个问题,NuPy也。
    有什么建议吗?

    如果输入矩阵实际上是正定的,Cholesky分解应该是相当稳定的。如果矩阵是(接近)半定矩阵或非定矩阵,则可能会出现问题。 在这种情况下,可以使用LDLT分解。对于输入
    A
    ,它计算排列
    P
    、单位对角线三角形
    L
    和对角线
    D
    ,从而

     A = P.T*L*D*L.T*P
    
    A = V * D * V^{-1}
    
    然后,您当然需要
    Y=sqrt(D)*L*X
    ,而不是乘
    Y=L*X
    ,其中
    sqrt(D)
    是一个元素相关的sqrt(我不知道python语法)

    请注意,您可以忽略置换,因为置换相同独立分布随机数的向量仍然是i.i.d.数的向量

    如果仍然不起作用,请尝试使用
    自伴特征解算器
    -分解。 这计算特征值的对角矩阵
    D
    和特征向量的一元矩阵
    V
    ,从而

     A = P.T*L*D*L.T*P
    
    A = V * D * V^{-1}
    

    你基本上可以做和上面一样的事情。(注意,对于一元论矩阵,
    V^{-1}
    只是
    V
    的伴随,即在实值情况下,
    V^{-1}=V^T

    谢谢,我最后做了一个自伴随矩阵分解,它做了三次简单的注释,但你的上一个方程应该是
    a=V*D*V^T
    ,因为如果不利用V的正交性来为你的利益服务,那将是一种耻辱。