Как рассчитать обобщенную обратную разреженную матрицу в scipy

У меня есть разреженная матрица W, когда я использую linalg.pinv(W), она выдает некоторые ошибки:

Traceback (most recent call last):
  File "/Users/ad9075/PycharmProjects/bednmf/test.py", line 14, in testNmfRun
    self.factor = factorization(self.V)
  File "/Users/ad9075/PycharmProjects/bednmf/nmf.py", line 18, in factorization
    W_trans = linalg.pinv(W)
  File "/Library/Python/2.7/site-packages/scipy/linalg/basic.py", line 540, in pinv
    b = np.identity(a.shape[0], dtype=a.dtype)
IndexError: tuple index out of range`

Но когда я изменяю его на linalg.pinv(W.todense()), он работает хорошо. Однако действительно ли мне нужно преобразовывать разреженную матрицу, если я хочу вычислить сгенерированную обратную матрицу? У кого-нибудь есть идеи по этому поводу?

Спасибо!


person Hanfei Sun    schedule 02.11.2012    source источник


Ответы (2)


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

Таким образом, ваша задача разбивается на две части: (i) найти перестановку, которая делает ее блочно-диагональной, и (ii) вычислить обобщенную обратную, используя linalg.pinv отдельно для каждого блока. Если ваша матрица достаточно мала, то также эффективно сначала преобразовать ее в плотную матрицу, а затем вычислить псевдообратную.

Если вы, с другой стороны, хотите вычислить что-то вроде "A^{-1} x", использование gmres или какой-либо другой итерационной процедуры может быть более эффективным решением.

person pv.    schedule 03.11.2012

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

Но вы должны знать, что обратная матрица не обязательно является разреженной матрицей, и, как сказали Джордж Э. Форсайт и Клив Б. Молер:

«Почти все, что можно сделать с A^{-1}, можно сделать и без него»

person lucasg    schedule 02.11.2012