2016-10-18 4 views
0

Я работаю над домашним заданием, и я заметил, что когда размерность среднего и ковариации очень высока, multivariate_normal будет занимать весь процессор навсегда, без каких-либо результатов.numpy multivariate_normal ошибка при слишком большом размере

Пример фрагмента кода,

cov_true = np.eye(p) 
mean_true = np.zeros(p) 
beta_true = multivariate_normal(mean_true, cov_true, size=1).T 

когда p=5000, это будет работать вечно. Окружающая среда, python3.4 и python3.5, numpy 1.11.0

Действительно ли это ошибка или я что-то пропустил?

+0

Это работает для меня. Те же версии. измените третью строку на это, посмотрите, работает ли она: 'beta_true = np.random.multivariate_normal (mean_true, cov_true, size = 1) .T' – Yugi

+0

да, просто другой импорт, сколько времени вам нужно для запуска этого линия? – 1a1a11a

+0

«Да» означает, что он работал и не принимал 100% -ный процессор? Мой: '--- 15.3049829006 секунд ---' – Yugi

ответ

2

Что занимает так много времени?

Для учета отношений между переменными NumPy computes the singular value decomposition вашей ковариационной матрицы, и это занимает большую часть времени (underlying GESDD в общем Q (п) и 5000 уже немного).

Как можно ускорить процесс?

В простейшем случае со всеми переменными независимыми, вы могли бы просто использовать random.normal:

from numpy.random import normal 

sample = normal(means, deviations, len(means)) 

В противном случае, если ковариационная матрица случается полный ранг (следовательно, положительно определенной), вытеснит svd с cholesky (прежнему Θ (п) в целом, но с меньшим постоянным):

from numpy.random import standard_normal 
from scipy.linalg import cholesky 

l = cholesky(covariances, check_finite=False, overwrite_a=True) 
sample = means + l.dot(standard_normal(len(means))) 

Если матрица может быть вырожденной (как это сом в этом случае), затем либо оберните SPSTRF, либо подумайте о помощи с scipy#6202.

Cholesky, вероятно, будет заметно быстрее, но если этого недостаточно, то вы можете исследовать, если бы было невозможно анализировать аналитическую матрицу или попытаться использовать другую базовую библиотеку (такую ​​как ACML, MKL, или cuSOLVER).

+0

Он сообщает об ошибке, 'образец = нормальный (mean_true, cov_true, Len (mean_true)) Traceback (самый последний вызов последнего): Файл "", строка 1, в Файл«mtrand .pyx ", строка 1495, в mtrand.RandomState.normal (numpy/random/mtrand/mtrand.c: 10068) ValueError: scale <= 0 ' – 1a1a11a

+0

Вы можете использовать что-то вроде 'np.sqrt (cov_true.diagonal ()) ', чтобы выбрать стандартные отклонения от ковариационной матрицы. Первый метод корректен, если все недиагональные записи равны нулю. – wrwrwr

+0

@wrwrwr означает, что сложность * константа * в количестве выборок, то есть 'np.random.multivariate_normal (size = 100)' не слишком медленнее, чем 'np.random.multivariate_normal (size = 10) '? Или это * linear * в 'size'? –

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