2013-05-15 2 views
1

Я попытался использовать numpy.random.multivariate_normal для случайных выборок на некоторых 30000+ переменных, в то время как он всегда занимал всю мою память (32G), а затем завершался. Фактически, корреляция является сферической, и каждая переменная коррелируется примерно с 2500 другими переменными. Есть ли другой способ указать сферическую ковариационную матрицу, а не полную ковариационную матрицу или любой другой способ уменьшить использование памяти?Недостаточно памяти при использовании multivariate_normal random sampliing numpy

Мой код выглядит так:

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

Можете ли вы разместить свой код? – Jaime

+0

Из этого и вашего другого вопроса я начинаю видеть, что то, что у вас есть, не является сферической ковариационной матрицей. Сферическая ковариационная матрица имеет все элементы по диагонали равными, а все диагональные элементы равны нулю. Я угадываю здесь, но кажется, что только около 2500 из 30000 элементов в каждой строке вашей матрицы отличны от нуля. Это верно? Возможно, вы сможете делать то, что хотите, используя изменение координат и разреженный модуль Scipy, но требуется дополнительная информация о фактической структуре вашей ковариационной матрицы. – Jaime

+0

Да, каждая строка содержит 2500 ненулевых элементов. Хотя это просто упрощение проблемы. Вся проблема такова: массив переменных 512X512, каждая переменная коррелирует со своим соседом в радиусе 256, а коэффициент корреляции - как бы обратно пропорциональный расстоянию. Поэтому я попытался обработать этот массив как 1-D массив размером 512x512 = 262144 и построить для него 'cm' (размер которого 262144x262144), а затем сделать многомерную случайную выборку. – hookch

ответ

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]]) 
+0

Благодарим за помощь! Я думаю, что это правда, что проблема связана с построением массива 'cm'. Похоже, что ваш код рассматривает каждую переменную как независимую друг от друга, не так ли? В то время как я 'cm' не является диагональным, так как некоторые переменные коррелированы. – hookch

+0

@hookch Тогда у вас нет сферической ковариационной матрицы ... – Jaime

Смежные вопросы