Sympy — плотное матричное отображение обратной матрицы

Я использую Sympy для выполнения простого примера регрессии. в надежде, что он станет эффективным инструментом для декомпозиции более сложных оценок. Однако я не могу понять, как отображать плотные матрицы для каждого шага процесса. В частности, я зацикливаюсь, пытаясь представить оценку методом наименьших квадратов:

бета

Вот установка всего с пятью наблюдениями.

from sympy import *

y=MatrixSymbol('y',5,1)
x=MatrixSymbol('x',5,2)
b=MatrixSymbol('b',2,1)

Я могу представить основные компоненты:

(x.T*x).as_explicit()

введите здесь описание изображения

(x.T*y).as_explicit()

введите здесь описание изображения

И я даже могу символически представить инверсию первого компонента.

(x.T*x).I

введите здесь описание изображения

Однако, когда я пытаюсь расширить инверсию первого компонента, я получаю ошибку IndexError.

(x.T*x).I.as_explicit()

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-182-93739c34be6e> in <module>()
----> 1 (x.T*x).I.as_explicit()

/home/choct155/analysis/Anaconda/lib/python2.7/site-packages/sympy/matrices/expressions/matexpr.pyc in as_explicit(self)
    230         return ImmutableMatrix([[    self[i, j]
    231                             for j in range(self.cols)]
--> 232                             for i in range(self.rows)])
    233 
    234     def as_mutable(self):

/home/choct155/analysis/Anaconda/lib/python2.7/site-packages/sympy/matrices/expressions/matexpr.pyc in __getitem__(self, key)
    198             i, j = sympify(i), sympify(j)
    199             if self.valid_index(i, j) is not False:
--> 200                 return self._entry(i, j)
    201             else:
    202                 raise IndexError("Invalid indices (%s, %s)" % (i, j))

/home/choct155/analysis/Anaconda/lib/python2.7/site-packages/sympy/matrices/expressions/matpow.pyc in _entry(self, i, j)
     27         if self.exp.is_Integer:
     28             # Make an explicity MatMul out of the MatPow
---> 29             return MatMul(*[self.base for k in range(self.exp)])._entry(i, j)
     30 
     31 from matmul import MatMul

/home/choct155/analysis/Anaconda/lib/python2.7/site-packages/sympy/matrices/expressions/matmul.pyc in _entry(self, i, j, expand)
     45             return coeff * matrices[0][i, j]
     46 
---> 47         head, tail = matrices[0], matrices[1:]
     48         assert len(tail) != 0
     49 

IndexError: list index out of range

Обратное существует, поэтому я просто прошу Sympy сделать что-то, чего он не может? Цель здесь состоит в том, чтобы явно пройти через каждый компонент процедуры оценки как с матричным представлением, так и с манипуляциями с данными в блокноте IPython. Я не смог найти решение этой проблемы, поэтому любая помощь на этом фронте будет принята с благодарностью.


person Marvin Ward Jr    schedule 02.01.2014    source источник


Ответы (2)


Это ошибка. Я открыл для него https://github.com/sympy/sympy/issues/2749. . Обходной путь будет (x.T*x).as_explicit().I, но, похоже, он вызывает собственное исключение (https://github.com/sympy/sympy/issues/2750). Поэтому, пока один из них не будет исправлен, у меня, к сожалению, нет для вас хорошего решения, кроме как вычислить обратное вручную, используя .det() и обычную формулу для матриц 2x2.

person asmeurer    schedule 10.01.2014
comment
И запросы на вытягивание приветствуются, если вы хотите попытаться устранить одну из ошибок. - person asmeurer; 10.01.2014

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

I = Identity(3)
I.as_explicit()
  1  0  0 
  0  1  0
  0  0  1
I.I.as_explicit()
  1  0  0
  0  1  0
  0  0  1
person user3153970    schedule 02.01.2014
comment
Спасибо за комментарий, но боюсь, я не совсем понимаю, чем второй вызов концептуально отличается от моего вызова, вызвавшего ошибку IndexError. Не могли бы вы уточнить? - person Marvin Ward Jr; 02.01.2014