인공지능/머신러닝

[머신러닝 - Python] 기울기 구현 (Gradient Implementation)

바보1 2022. 8. 6. 19:36

함수 f를 받아서 중앙 차분을 이용하여 수치 미분하는 코드

정확한 미분 값을 구하지는 못하므로 수치 미분이라고 함

 

아무튼 해당 함수와 특정 좌표를 받아서 h라는 미세한 값을 더하고(A), 뺀 뒤(B), A와 B의 차이를 계산하여 기울기를 구하는 방식

 

좌표가 n개가 되면 각각의 n의 f 위에서의 기울기를 구한 뒤 반환함

 

만약 좌표가 2차원이라면 1개의 차원씩 잘라서 계산 후, 반환함

 

즉, f 함수에서 각각의 좌표에 해당하는 지점에서의 기울기를 구한다.

import numpy as np


def numerical_gradient(f, x):
    # 함수 f를 x 좌표에서의 편미분 값을 반환하는 함수
    h = 1e-4
    grad = np.zeros_like(x)

    for idx in range(x.size):
        tmp_val = x[idx]
        
        x[idx] = tmp_val + h
        fxh1 = f(x)
        
        x[idx] = tmp_val - h
        fxh2 = f(x)

        grad[idx] = (fxh1 - fxh2) / (2 * h)
        x[idx] = tmp_val

    return grad


def numerical_gradient_2d(f, x):
    if x.ndim == 1:
        return numerical_gradient(f, x)
    else:
        grad = np.zeros_like(x)
        
        for idx, x in enumerate(x):
            grad[idx] = numerical_gradient(f, x)
        
        return grad


if __name__ == "__main__":
    from numerical_diff import function_2
    value = numerical_gradient(function_2, np.array([3.0, 4.0]))
    print(value)