import numpy as np
def numerical_gradient(f, x):
"""
수치적으로 함수 f의 gradient(기울기)를 계산하는 함수.
:param f: 미분하려는 함수
:param x: 기울기를 구하려는 점의 좌표 (numpy 배열)
:return: 주어진 점에서의 함수 f의 기울기 (numpy 배열)
각 변수에 대해 중심 차분법을 사용하여 기울기를 계산한다.
"""
h = 1e-4 # 아주 작은 값, 수치 미분을 위한 delta 값
grad = np.zeros_like(x) # 입력과 동일한 shape를 가지는 gradient 배열 초기화
for idx in range(x.size): # 각 변수에 대해 반복
tmp_val = x[idx] # 변수의 원래 값 저장
# f(x + h) 계산
x[idx] = tmp_val + h
fxh = f(x) # 함수 f에서의 값 계산
# f(x - h) 계산
x[idx] = tmp_val - h
fxh2 = f(x) # 함수 f에서의 값 계산
# 중심 차분을 사용한 기울기 계산
grad[idx] = (fxh - fxh2) / (2 * h)
# 원래의 변수 값 복원
x[idx] = tmp_val
return grad
{함수 가 주어졌을 때, 변수 에 대한 기울기 는 중심 차분법에 의해 다음과 같이 계산된다.
모든 변수 에 대해 반복하면, 함수 의 기울기 벡터인 를 구할 수 있다.
중심 차분법은 양쪽에서 기울기를 계산하여 오차가 상쇄되기 때문에, 전진 차분법(forward difference method), 후진 차분법(backward difference method)보다 더 정확하다.
두 미분법의 오차는 big O 표기법으로 나타낼 수 있으며, 중심차분법은 O(h^2), 전진/후진 차분법은 O(h)의 차수 오차를 갖고 있다.
중심 차분법의 차수 오차는 테일러 급수를 사용하여 근사치를 표현하고, 오차 항을 도출하여 구할 수 있다.
먼저 를 에 대해 근사하여 테일러 급수로 나타내면
로 나타낼 수 있으며,
반대로 에 대해서는
로 나타낼 수 있다.
중심 차분법에서는 를 사용하여 기울기를 계산하는데,
위의 테일러 급수를 대입하면
위의 식을 구하여 차수 오차가 인 것을 확인 할 수 있다.