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}$의 기울기 벡터를 고려합니다.
결론을 보면
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}
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는 적분과 행렬 계산도 가능하기 때문에 매우 편리하다고 생각했습니다.
참고 링크
Reference
이 문제에 관하여(Sympy로 그라디언트 벡터를 계산하고 싶습니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/moribito/items/d23b770b84f938a5ccf7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)