Инвертирование больших разреженных матриц с помощью 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] 
  • Python: найти принципиальное значение целого численного
  • Обнуление массива в Python
  • Многомерная оценка плотности ядра в Python
  • поиск ближайших элементов в двух списках / массивах в Python
  • numpy cov (ковариация), что именно он вычисляет?
  • Может ли scipy.stats идентифицировать и маскировать очевидные выбросы?
  • Стандартное отклонение для установленных параметров с scipy.ODR, когда данные содержат ошибку
  • Как вычислить вероятность значения, заданного списком выборок из дистрибутива в Python?
  • Python - лучший язык программирования в мире.