我可以使用dask创建一个多变量正规矩阵吗



与此帖子有关的内容,我正在尝试在dask中复制multivariate_normal:使用numpy,我可以创建一个具有指定协方差的多元正态矩阵,使用:

import numpy as np
n_dim = 5
size = 300
A = np.random.randn(n_dim, n_dim) # a matrix
covm = A.dot(A.T) # A*A^T is positive semi-definite, as a covariance matrix
x = np.random.multivariate_normal(size=300, mean=np.zeros(len(covm)),cov=covm) # generate data

然而,我需要具有n_dim = 4_500_000size = 100000的显著大的矩阵。这对于CPU和存储器来说都是昂贵的计算。幸运的是,我可以访问Cloudera DataScience Workbench集群,并试图使用dask:解决此问题

import dask.array as da
n_dim = 4_500_000
size = 100000
A = da.random.standard_normal((n_dim, n_dim))  
covm = A.dot(A.T)
#x = da.random.multivariate_normal(size=300, mean=np.zeros(len(covm)),cov=covm) # generate data

在文档中,我找不到任何似乎能满足我需要的功能。有人知道解决方案/工作方法吗,可能是使用xarray或任何其他在集群上运行的模块?

目前的工作是使用cholesky分解。注意,任何协方差矩阵C都可以表示为C=G*G’。因此,如果y是标准正态,那么x=G'*y就与C中指定的相关(请参阅StackExchange Mathematic上的这篇优秀文章(。代码中:

Numpy

n_dim =4
size = 100000
A = np.random.randn(n_dim, n_dim)
covm = A.dot(A.T)
x=  np.random.multivariate_normal(size=size, mean=np.zeros(len(covm)),cov=covm)
## verify numpys covariance is correct
np.cov(x, rowvar=False)
covm

Dask

## create covariance matrix
A = da.random.standard_normal(size=(n_dim, n_dim),chunks=(2,2))
covm = A.dot(A.T)
## get cholesky decomp
L = da.linalg.cholesky(covm, lower=True)
## drawn standard normal 
sn= da.random.standard_normal(size=(size, n_dim),chunks=(100,100))
## correct for correlation
x =L.dot(sn.T)
x.shape
## verify
covm.compute()
da.cov(x, rowvar=True).compute()

最新更新