Я попытался использовать 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)
Можете ли вы разместить свой код? – Jaime
Из этого и вашего другого вопроса я начинаю видеть, что то, что у вас есть, не является сферической ковариационной матрицей. Сферическая ковариационная матрица имеет все элементы по диагонали равными, а все диагональные элементы равны нулю. Я угадываю здесь, но кажется, что только около 2500 из 30000 элементов в каждой строке вашей матрицы отличны от нуля. Это верно? Возможно, вы сможете делать то, что хотите, используя изменение координат и разреженный модуль Scipy, но требуется дополнительная информация о фактической структуре вашей ковариационной матрицы. – Jaime
Да, каждая строка содержит 2500 ненулевых элементов. Хотя это просто упрощение проблемы. Вся проблема такова: массив переменных 512X512, каждая переменная коррелирует со своим соседом в радиусе 256, а коэффициент корреляции - как бы обратно пропорциональный расстоянию. Поэтому я попытался обработать этот массив как 1-D массив размером 512x512 = 262144 и построить для него 'cm' (размер которого 262144x262144), а затем сделать многомерную случайную выборку. – hookch