2014-01-02 3 views
1

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

beta

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

from sympy import * 

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

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

(x.T*x).as_explicit() 

enter image description here

(x.T*y).as_explicit() 

enter image description here

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

(x.T*x).I 

enter image description here

Однако при попытке расширить инверсию первого компонента, я получаю отдавало с 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 

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

ответ

0

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

+0

И тянуть запросы приветствуются, если вы хотите попытаться решить одну из ошибок. – asmeurer

0

Сомневаюсь, что метод 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 
+0

Спасибо за комментарий, но я боюсь, что не понимаю, как второй вызов концептуально отличается от моего вызова, который бросил IndexError. Не могли бы вы разобраться? –

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