我尝试使用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)
答案 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]])