如何在J中生成多元正态分布

时间:2017-12-01 04:14:14

标签: random normal-distribution j multivariate-testing

如果给出平均值向量和协方差矩阵,如何在J中生成多元分布?

例如,在Python中, np.random.multivariate_normal([0,0],[[1,.75],[.75,1]],1000) 生成多变量分布,[0,0]作为均值向量,[[1,.75],[.75,1]]作为方差 - 协方差矩阵? 感谢

1 个答案:

答案 0 :(得分:2)

维基百科描述了一个standard method for creating multivariate normal distributions

   Mu=: 0 0                   NB. vector of means
   ]Sigma=: 1 0.75 ,: 0.75 1  NB. covariance matrix
   1 0.75
0.75    1

我们可以使用this J wiki essay中的代码获取协方差矩阵的Cholesky分解(或使用LAPACK addon

   A=: Cholesky Sigma         NB. Cholesky decomp

使用stats/distribs插件创建2个独立的单变量正态变量。

   load 'stats/distribs'
   z=: rnorm 2 1000           NB. 2 standard normal variables sampled 1000 times

现在生成所需的多变量分布:

   X=: Mu + A mp z

现在检查分布是否符合指定:

   load 'stats/base'
   mean"1 X
0.0264368 0.00887907    NB. mean close to 0 (Mu)
   stddev"1 X
0.987214 0.991614       NB. stddev close to 1 (sqrt of diagonal of Sigma)
   corr/ X
0.746917                NB. correlation close to 0.75 (off-diagonal of Sigma)

我们可以将其编码为单个动词:

multivar_norm=: dyad define
  'Mu Sigma'=. x
  A=. Cholesky Sigma
  z=. rnorm y ,~ #Sigma
  Mu + A mp z
)

   X=: (Mu;Sigma) multivar_norm 1000
   ((mean , stddev)"1 ; corr/) X
┌──────────────────┬────────┐
│0.0199138  1.01788│0.749184│
│ 0.035176 0.987191│        │
└──────────────────┴────────┘