Инвертирование больших разреженных матриц с помощью scipy

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

Матрицы, которые мне нужно инвертировать, обычно большие (40000 * 40000) и имеют только несколько ненулевых диагоналей. Мой нынешний подход состоит в том, чтобы построить все разреженное, а затем

posterior_covar = np.linalg.inv ( hessian.todense() )

это явно занимает много времени и много памяти.

Любые намеки, или это всего лишь вопрос терпения или уменьшение проблемы?

One Solution collect form web for “Инвертирование больших разреженных матриц с помощью scipy”

Я не думаю, что разреженный модуль имеет явный обратный метод, но он имеет редкие решатели. Что-то вроде этого примера игрушек работает:

 >>> a = np.random.rand(3, 3) >>> a array([[ 0.31837307, 0.11282832, 0.70878689], [ 0.32481098, 0.94713997, 0.5034967 ], [ 0.391264 , 0.58149983, 0.34353628]]) >>> np.linalg.inv(a) array([[-0.29964242, -3.43275347, 5.64936743], [-0.78524966, 1.54400931, -0.64281108], [ 1.67045482, 1.29614174, -2.43525829]]) >>> a_sps = scipy.sparse.csc_matrix(a) >>> lu_obj = scipy.sparse.linalg.splu(a_sps) >>> lu_obj.solve(np.eye(3)) array([[-0.29964242, -0.78524966, 1.67045482], [-3.43275347, 1.54400931, 1.29614174], [ 5.64936743, -0.64281108, -2.43525829]]) 

Обратите внимание, что результат транспонирован!

Если вы ожидаете, что ваш обратный также будет разреженным, а плотное возвращение из последнего решения не поместится в память, вы также можете генерировать его по одной строке (столбцу) за раз, извлекать ненулевые значения и строить разреженные обратная матрица:

 >>> for k in xrange(3) : ... b = np.zeros((3,)) ... b[k] = 1 ... print lu_obj.solve(b) ... [-0.29964242 -0.78524966 1.67045482] [-3.43275347 1.54400931 1.29614174] [ 5.64936743 -0.64281108 -2.43525829] 
  • Цифровой фильтр 2D-изображений двумя масками
  • Как выполнить экспоненциальную и логарифмическую подгонку кривой в Python? Я нашел только полиномиальную подгонку
  • Якобиан и Гессен в `scipy.optimize.minimize`
  • Argmax каждой строки или столбца в scipy разреженной матрице
  • Подгонка кривой 6-й степени с помощью numpy / scipy
  • ECDF в python без функции шага?
  • Эффективная нарезка матриц с использованием матричного умножения с помощью Python, NumPy, SciPy
  • Почему dir не показывает все атрибуты объекта Python?
  • Python - лучший язык программирования в мире.