Pythonで導関数を計算する方法は?今回は、Pythonのsympyというライブラリを使って、微分を遊んでみましょう。
微分って何?
微分は微積分の基本的な道具です。
機械学習における勾配降下法で損失関数を最適化する際に、導関数があればこそ、非常に有効です。
例えば、xに依存する関数y = f(x)があったとして、この関数の微分とは、xの変化に対して関数の値yがどの程度の割合で変化するかということです。
これは決して導関数の基礎についての記事ではありませんし、そうすることもできません。
微分積分は、特別な注意が必要な別物なのです。
あなたは微積分をある程度学んだことがあると思います.この記事は、Sympy ライブラリを使用して関数を微分する方法を示すことを目的としています。
この記事もチェック:Pythonで機械学習をライブラリや概要をまとめてみた
Sympy を使った Python による微分の解法
SymPyは記号数学のためのPythonのライブラリです。
フル機能の計算機代数システム(CAS)を目指しながら、コードはできるだけシンプルに、Cool isn’t itを目指します。
1. PIPを使ったSympyのインストール
SymPyは微分計算以外にも使い道がありますが、今回は微分計算を中心に説明します。
pipパッケージマネージャを使用してインストールするために、pip install sympy
を実行します。
2. Sympy の diff() を使って微分を解く
微分のために、sympy は関数の微分を出力する diff
メソッドを用意しています。
- 関数 f(x) = x² があるとします。
- xに対する関数の微分:f'(x) = 2x
では、sympyを使ってどのように実現できるかを見てみましょう。
#Importing sympy from sympy import *
# create a "symbol" called x x = Symbol( 'x' )
#Define function f = x * * 2
#Calculating Derivative derivative_f = f.diff(x)
derivative_f |
from sympy import *
# create a "symbol" called x x = Symbol( 'x' )
#Define function f = x * * 2
f1 = lambdify(x, f)
#passing x=2 to the function f1( 2 )
|
シンボルを宣言することは、関数が変数 ‘x’ を持つこと、または単に関数が x に依存することを言うのと似ています。
3. Pythonで導関数を解く
x = 2 における関数の微分を計算するために、python には lambdify
という関数があります。
import sympy as sym
#Power rule x = sym.Symbol( 'x' )
f = x * * 5
derivative_f = f.diff(x)
derivative_f |
出力:4
Python による基本的な微分ルール sympy
微分可能な関数の微分を計算するために、いくつかのルールがあります。
最もよく使われる規則がいくつかあります。
- べき乗則
- 積の法則
- 連鎖の法則
- 商の法則
それでは、一般的な微分の法則にあるように、実際にsympyを使って微分を計算する方法を考えてみましょう。
1. べき乗則
一般に:f'(xn) = nx(n-1)
例:関数f(x) = x⁵があるとします。
その微分は次のようになる:f'(x) = 5x(5-1) = 5×4
(uv)′ = u′v + uv′ |
import sympy as sym
#Product Rule x = sym.Symbol( 'x' )
f = sym.exp(x) * sym.cos(x)
derivative_f = f.diff(x)
derivative_f |
2. 積の法則
u(x)とv(x)を微分可能な関数とします。
このとき、関数u(x)v(x)の積もまた微分可能です。
import sympy as sym
#Chain Rule x = sym.Symbol( 'x' )
f = sym.cos(x * * 2 )
derivative_f = f.diff(x)
derivative_f |
例:f(x) = exp(x)⑭*cos(x)
import sympy as sym
#Derivatives of multivariable function x , y = sym.symbols( 'x y' )
f = x * * 4 + x * y * * 4
#Differentiating partially w.r.t x derivative_f = f.diff(x)
derivative_f |
import sympy as sym
#Derivatives of multivariable function x , y = sym.symbols( 'x y' )
f = x * * 4 + x * y * * 4
#Differentiating partially w.r.t y derivative_f = f.diff(y)
derivative_f |
3. 鎖の法則
連鎖法則とは、関数の合成の微分を計算するものです。
- 例えば、関数 h(x) = f( g(x) ) があるとします。
- とすると、連鎖法則では h′(x) = f ′(g(x)) g′(x) となります。
- 例:f(x) = cos(xxxxxxx*2)
この処理は、商則にも拡張できる。
もうお分かりだと思いますが、関数が変わるだけで、応用は同じで、あとはライブラリ自身がやってくれます。
import sympy as sym
#Derivatives of multivariable function x , y = sym.symbols( 'x y' )
f = x * * 4 + x * y * * 4
#Differentiating partially w.r.t x and y derivative_f = f.diff(x,y)
derivative_f |
sympy を用いた多変数関数の導関数
上で見た例では変数が1つだけでした。
しかし、私たちは複数の変数を持つ関数に遭遇することがよくあります。
このような導関数は一般に偏導関数と呼ばれます。
多変数関数の偏微分とは,1つの変数に関して,他のすべての変数を一定にした微分のことです.
例: f(x,y) = x4 + x * y4
上記の導関数をPythonでxについて偏微分してみましょう.
変数の数が 1 以上あるときは,symbols
を使用します.
コードは全く同じですが、今度は y が diff
メソッドの入力引数として渡されます。
まずxを部分微分し、次にyを部分微分することができます。
まとめ
この記事では、微分やPythonで微分を解く方法についてではなく、Pythonのパッケージを活用して関数の微分を実行する方法について説明しました。
微分は素晴らしいもので、機械学習やそれ以外の分野でも重要な役割を果たすので、その背後にある考え方をぜひ知っておいてください。