1

我尝试使用 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)
4

1 回答 1

1

如果您的相关性是球形的,这就像说沿每个维度的值与其他维度不相关,并且沿每个维度的方差是相同的。您根本不需要构建协方差矩阵,从 30,000 维多元法线中抽取一个样本与从一维法线中抽取 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]])
于 2013-05-15T21:35:03.647 回答