首页 文章

Sympy - 矩阵逆的密集矩阵显示

提问于
浏览
1

我正在使用Sympy来运行一个基本的回归示例,希望它能成为分解更复杂的估算器的有效工具 . 但是,我无法弄清楚如何为流程中的每个步骤显示密集矩阵 . 特别是,我试图表示最小二乘估计值:

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

反过来存在,所以我只是要求Sympy做一些不能做的事情吗?这里的目标是使用IPython Notebook中的矩阵表示和数据处理来明确地逐步执行估计过程的每个组件 . 我一直无法找到解决方案,所以在这方面的任何帮助将不胜感激 .

2 回答

  • 0

    这是一个错误 . 我为它打开了https://github.com/sympy/sympy/issues/2749 . 解决方法是 (x.T*x).as_explicit().I ,但它似乎引发了自己的异常(https://github.com/sympy/sympy/issues/2750) . 所以,除非其中一个被修复,否则我遗憾的是没有一个好的解决方案,除了使用 .det() 和2x2矩阵的常用公式手动计算逆 .

  • 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
    

相关问题