使用numpy的多变量正态随机抽样时内存不足

时间:2013-05-15 20:34:22

标签: python memory numpy

我尝试使用numpy.random.multivariate_normal对一些30000+变量进行随机采样,而它总是占用我所有的内存(32G)然后终止。实际上,相关性是球形的,每个变量与大约2500个其他变量相关。是否有另一种方法来指定球面协方差矩阵,而不是完整的协方差矩阵,或任何其他方式来减少内存的使用?

我的代码是这样的:

cm = [] #covariance matrix  
for i in range(width*height):  
    cm.append([])  
    for j in range(width*height):  
        cm[i].append(corr_calc()) #corr is inversely proportional to the distance    
mean = [vth]*(width*height)  
cache_vth=numpy.random.multivariate_normal(mean,cm)

1 个答案:

答案 0 :(得分:1)

如果您的相关性是球形的,那就像说每个维度的值与其他维度不相关,并且每个维度的方差相同。您根本不需要构建协方差矩阵,从30,000-D多元法线中抽取一个样本与从一维法线中抽取30,000个样本相同。也就是说,而不是:

n = 30000
mu= 0
corr = 1
cm = np.eye(n) * corr
mean = np.ones((n,)) * mu
np.random.multivariate_normal(mean, cm)

尝试构建cm数组时失败,请尝试以下操作:

n = 30000
mu = 0
corr = 1
>>> np.random.normal(mu, corr, size=n)
array([ 0.88433649, -0.55460098, -0.74259886, ...,  0.66459841,
        0.71225572,  1.04012445])

如果您想要多个随机样本,例如3,请尝试

>>> np.random.normal(mu, corr, size=(3, n))
array([[-0.97458499,  0.05072532, -0.0759601 , ..., -0.31849315,
        -2.17552787, -0.36884723],
       [ 1.5116701 ,  2.53383547,  1.99921923, ..., -1.2769304 ,
         0.36912488,  0.3024549 ],
       [-1.12615267,  0.78125589,  0.67133243, ..., -0.45441239,
        -1.21083007,  1.45696714]])