이번에는 함수의 경사도를 수치적으로 계산하는 python 코드를 만들어 보겠습니다. 이 코드에서는 수치 미분을 위해 중앙 차분 (미분값을 구하는 x의 전후의 차분, 즉 x − h와 x + h)을 이용합니다.
1. gradient 함수 만들기
먼저 만들어진 python 코드를 보겠습니다.
import numpy as np
def numerical_gradient(f, x):
h = 1e-4 #차분(difference)의 크기
grad = np.zeros_like(x)
for idx in range(x.size):
tmp_value = x[idx] #계산을 위한 임시값
x[idx] = tmp_value + h
fxh1 = f(x)
x[idx] = tmp_value - h
fxh2 = f(x)
grad[idx] = (fxh1 -fxh2) / (2*h)
x[idx] = tmp_value
return grad
이 코드는 주어진 함수 f(x)에 대한 수치적인 gradient를 계산하는 함수입니다.
먼저 수치적 gradient를 계산하기 위해 h(변화량)를 0.0001로 설정합니다.
그리고 np.zeros_like()은 x와 같은 형태를 가지고 0으로 채워진 배열(grad)을 만듭니다.
그다음, x의 각 차원에 대해 순서대로 반복하며 수치적 gradient를 계산합니다.
여기서 idx는 현재 처리 중인 차원의 인덱스를 나타냅니다.
tmp_value 변수에 현재 처리 중인 차원의 값을 저장하고, x[idx] 값에 h를 더한 다음, f(x)를 호출하여 그 차원에서의 f(x)의 변화량을 계산합니다. 이것을 fxh1에 저장합니다.
다음으로, x[idx] 값에 h를 뺀 다음, f(x)를 호출하여 그 차원에서의 f(x)의 변화량을 계산합니다. 이것을 fxh2에 저장합니다.
그다음, (fxh1 - fxh2) / (2*h)로 수치적 gradient를 계산합니다. 이 값을 grad[idx]에 저장합니다.
마지막으로, tmp_value에 저장된 값으로 x[idx] 값을 복원합니다.
이렇게 모든 차원에서 수치적 gradient를 계산한 후, grad 배열을 반환합니다.
2. 예시 함수 만들기
이제 gradient를 구하고자 하는 함수를 더해 보겠습니다.
위 코드에 연결해서 아래의 코드를 작성합니다.
def function_1(x):
return np.sqrt(np.sum(x**2))
print(numerical_gradient(function_1, np.array([1.0, 2.0])))
여기서는 함수 f(x) = $\sqrt{x_{1}^{2} + x_{2}^{2} + ...}$를 정의하였습니다.
그리고 이 함수의 x = [1.0, 2.0]의 gradient를 출력하도록 하였습니다.
코드의 결과는 다음과 같습니다.
[0.4472136 0.89442719]
'Python > python 응용: 수학 및 과학' 카테고리의 다른 글
Matplotlib을 이용해서 다중 그래프 그리기: subplot (0) | 2023.04.27 |
---|---|
python append 메소드로 계산 결과 기록하기 (1) | 2023.04.19 |
python에서 세 점으로 이뤄진 삼각형의 넓이 구하기 (0) | 2023.04.14 |
불리언 배열이 numpy.sum 함수에서 어떻게 더해지나? (0) | 2023.04.13 |
Python NumPy 배열 만들기: arange()와 linspace()의 차이 (0) | 2022.12.28 |
댓글