我可以使用 dask 创建一个 multivariate_normal 矩阵吗?
Can I create a multivariate_normal matrix using 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_000
和 size = 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
在 documentation 中,我找不到任何功能似乎可以满足我的需要。有谁知道解决方案/解决方法,可能使用 xarray
或任何其他在集群上运行的模块?
目前的一种解决方法是使用 cholesky 分解。请注意,任何协方差矩阵 C 都可以表示为 C=G*G'。然后,如果 y 是标准正态分布,则 x = G'*y 与 C 中指定的相关(参见 StackExchange Mathematic 上的 excellent post)。在代码中:
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
达斯克
## 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()
与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_000
和 size = 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
在 documentation 中,我找不到任何功能似乎可以满足我的需要。有谁知道解决方案/解决方法,可能使用 xarray
或任何其他在集群上运行的模块?
目前的一种解决方法是使用 cholesky 分解。请注意,任何协方差矩阵 C 都可以表示为 C=G*G'。然后,如果 y 是标准正态分布,则 x = G'*y 与 C 中指定的相关(参见 StackExchange Mathematic 上的 excellent post)。在代码中:
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
达斯克
## 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()