edo1z blog

プログラミングなどに関するブログです

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)