2014-01-02 2 views
2

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

from sympy import * 
from sympy.abc import epsilon 

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

Я могу напечатать каждый из компонентов ...

y.as_explicit() 

enter image description here

(b*x).as_explicit() 

enter image description here

e.as_explicit() 

enter image description here

... но я не смог найти, однако, метод SymPy, что позволяет полного уравнения для отображения (следующее было вынесено с online latex editor):

enter image description here

в принципе любое время я использую оператор равенства оно обоснованно принято в качестве задания, и аддитивные операторы преобразуют MatrixSymbol в MatAdd объекта, который не поддерживает метод as_explict(). Любые мысли по этому вопросу будут оценены.

+0

Вы сделали опечатку? 'b * x' неверно. – asmeurer

ответ

0

Если вы вызываете конструктор MatAdd явно, он не оценивает. Чтобы создать равенство, используйте Eq. Кажется, есть рендеринг, но со знаком «плюс» в печатной форме Юникода, которую я открыл https://github.com/sympy/sympy/issues/2747.

In [14]: Eq(y.as_explicit(), MatAdd((x*b).as_explicit(), (e).as_explicit())) 
Out[14]: 
⎡y₀₀⎤ = ⎡x₀₀⋅b₀₀ + x₀₁⋅b₁₀⎤ + ⎡ε₀₀⎤ 
⎢ ⎥ ⎢     ⎥ ⎢ ⎥ 
⎢y₁₀⎥ ⎢x₁₀⋅b₀₀ + x₁₁⋅b₁₀⎥ ⎢ε₁₀⎥ 
⎢ ⎥ ⎢     ⎥ ⎢ ⎥ 
⎢y₂₀⎥ ⎢x₂₀⋅b₀₀ + x₂₁⋅b₁₀⎥ ⎢ε₂₀⎥ 
⎢ ⎥ ⎢     ⎥ ⎢ ⎥ 
⎢y₃₀⎥ ⎢x₃₀⋅b₀₀ + x₃₁⋅b₁₀⎥ ⎢ε₃₀⎥ 
⎢ ⎥ ⎢     ⎥ ⎢ ⎥ 
⎣y₄₀⎦ ⎣x₄₀⋅b₀₀ + x₄₁⋅b₁₀⎦ ⎣ε₄₀⎦ 

кажется печать LaTeX правильно, хотя:

In [16]: print(latex(Eq(y.as_explicit(), MatAdd((x*b).as_explicit(), (e).as_explicit())))) 
\left[\begin{matrix}y_{0, 0}\\y_{1, 0}\\y_{2, 0}\\y_{3, 0}\\y_{4, 0}\end{matrix}\right] = \left[\begin{matrix}x_{0, 0} b_{0, 0} + x_{0, 1} b_{1, 0}\\x_{1, 0} b_{0, 0} + x_{1, 1} b_{1, 0}\\x_{2, 0} b_{0, 0} + x_{2, 1} b_{1, 0}\\x_{3, 0} b_{0, 0} + x_{3, 1} b_{1, 0}\\x_{4, 0} b_{0, 0} + x_{4, 1} b_{1, 0}\end{matrix}\right] + \left[\begin{matrix}\epsilon_{0, 0}\\\epsilon_{1, 0}\\\epsilon_{2, 0}\\\epsilon_{3, 0}\\\epsilon_{4, 0}\end{matrix}\right] 

enter image description here

Вы можете использовать MatMul, если вы не хотите, чтобы оценить x*b:

In [18]: Eq(y.as_explicit(), MatAdd(MatMul(x.as_explicit(),b.as_explicit()), (e).as_explicit())) 
Out[18]: 
⎡y₀₀⎤ = ⎡x₀₀ x₀₁⎤⋅⎡b₀₀⎤ + ⎡ε₀₀⎤ 
⎢ ⎥ ⎢  ⎥ ⎢ ⎥ ⎢ ⎥ 
⎢y₁₀⎥ ⎢x₁₀ x₁₁⎥ ⎣b₁₀⎦ ⎢ε₁₀⎥ 
⎢ ⎥ ⎢  ⎥   ⎢ ⎥ 
⎢y₂₀⎥ ⎢x₂₀ x₂₁⎥   ⎢ε₂₀⎥ 
⎢ ⎥ ⎢  ⎥   ⎢ ⎥ 
⎢y₃₀⎥ ⎢x₃₀ x₃₁⎥   ⎢ε₃₀⎥ 
⎢ ⎥ ⎢  ⎥   ⎢ ⎥ 
⎣y₄₀⎦ ⎣x₄₀ x₄₁⎦   ⎣ε₄₀⎦ 

In [19]: print(latex(Eq(y.as_explicit(), MatAdd(MatMul(x.as_explicit(),b.as_explicit()), (e).as_explicit())))) 
\left\[\begin{matrix}y_{0, 0}\\y_{1, 0}\\y_{2, 0}\\y_{3, 0}\\y_{4, 0}\end{matrix}\right\] = \left\[\begin{matrix}x_{0, 0} & x_{0, 1}\\x_{1, 0} & x_{1, 1}\\x_{2, 0} & x_{2, 1}\\x_{3, 0} & x_{3, 1}\\x_{4, 0} & x_{4, 1}\end{matrix}\right\] \left\[\begin{matrix}b_{0, 0}\\b_{1, 0}\end{matrix}\right\] + \left\[\begin{matrix}\epsilon_{0, 0}\\\epsilon_{1, 0}\\\epsilon_{2, 0}\\\epsilon_{3, 0}\\\epsilon_{4, 0}\end{matrix}\right\] 

image

+0

Я сделал опечатку, но, к счастью, вы все равно собирали то, что я подавлял. Большое спасибо сэр! –

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