Sympy로 그라디언트 벡터를 계산하고 싶습니다!

3585 단어 파이썬sympy

1. 소개



대학의 과제에서 SymPy를 사용하여 수식 미분을 하는 과제가 나왔다. 그 때, 기울기 벡터를 구하는 것에 집착했으므로, 정리합니다.

2. SymPy로 구배 벡터를 구하는 방법



결론을 보면 sympy.tensor.array.derive_by_array() 함수로 구할 수 있습니다.

예를 들어, $\boldsymbol{a}=[a_1, a_2]^{\rm{T}}$, $\boldsymbol{b}=[b_1, b_2]^{\rm{T}}$일 때 $ f(\boldsymbol{a})=\boldsymbol{a}^{\rm{T}}\boldsymbol{b}$의 기울기 벡터를 고려합니다.
  • 손 계산

  • 먼저 $f(\boldsymbol{a})$를 확장합니다.
    f(\boldsymbol{a})=
    \left[
    a_1\ a_2
    \right]
    \begin{bmatrix}
    b_1 \\
    b_2
    \end{bmatrix}
    =a_1b_1+a_2b_2
    

    따라서 기울기 벡터 $\partial f(\boldsymbol{a})/\partial\boldsymbol{a}$는 다음과 같이 구할 수 있습니다.
    \dfrac{\partial f(\boldsymbol{a})}{\partial \boldsymbol{a}}
    =
    \begin{bmatrix}
    \dfrac{\partial f(\boldsymbol{a})}{\partial a_1} \\
    \dfrac{\partial f(\boldsymbol{a})}{\partial a_2}
    \end{bmatrix}
    =
    \begin{bmatrix}
    b_1 \\
    b_2
    \end{bmatrix}
    
  • SymPy로 계산

  • calculate_gradient.py
    import sympy as sp
    sp.init_printing() # Jupyter NotebookにおいてLaTex形式で表示するおまじない
    
    # 変数の定義
    a1, a2, b1, b2 = sp.symbols("a1 a2 b1 b2")
    
    # ベクトルa,bと関数f(a)の定義
    a = sp.Matrix([[a1], [a2]])
    b = sp.Matrix([[b1], [b2]])
    f = a.T*b
    
    f[0] # -> a_1*b_1+a_2*b_2
    
    # 勾配ベクトルの計算
    sp.tensor.array.derive_by_array(f[0], a)
    

    실행하면 다음과 같이 기울기 벡터가 계산되었습니다.


    3. 정리



    과제에서는 야코비 행렬도 구했는데, 함수 하나로 계산해 주고 「기술의 진보는 훌륭하다」라고 생각했습니다. 또한 SymPy는 적분과 행렬 계산도 가능하기 때문에 매우 편리하다고 생각했습니다.

    참고 링크


  • htps : // / cs. sympy. rg/1.0/_모즈 s/sympy/텐조 r/아라 y. HTML
  • 좋은 웹페이지 즐겨찾기