AI

Python - 偏微分・勾配

偏微分

偏微分は、変数が2つ以上あるときに1つ以外を固定にして、固定じゃない1つに対して微分をすることだそうです。Pythonでやると簡単にできます。

下記の式で、x0が3、x1が4のときの偏微分

[mathjax] $$f(x_0, x_1)=x_02+x_12$$

コード

import numpy as np
def numerical_diff(f, x):
h = 1e-4
return (f(x+h) - f(x-h)) / (2*h)
def func_x0(x0):
return x0**2 + 4**2
def func_x1(x1):
return 3**2 + x1**2
d0 = numerical_diff(func_x0, 3)
d1 = numerical_diff(func_x1, 4)
print(d0)
print(d1)

勾配

勾配は、すべての変数に対する偏微分をベクトルにしたものだそうです。

import numpy as np
def func(x):
return x[0]**2 + x[1]**2
def gradient(f, x):
h = 1e-4
grad = np.zeros_like(x)
for i in range(x.size):
tmp = x[i]
x[i] = tmp + h
y1 = f(x)
x[i] = tmp - h
y2 = f(x)
grad[i] = (y1 - y2) / (2 * h)
x[i] = tmp
return grad
g = gradient(func, np.array([3.0, 4.0]))
print(g)