-
AI 수치미분 Python 구현인공지능 2020. 5. 23. 05:28728x90
수치미분 구현 순서
구현 소스
// f 는 함수 // x 미분을 알고자 하는 입력 값 def numerical_derivative(f, x): // 반올림 오차발생을 막기 위해 너무 작게는 하지말고 10의 -4승 정도가 적당함 delta_x = 1e-4 return (f(x + delta_x) - f(x - delta_x)) / (2 * delta_x) def fun(x): return x ** 2 result = numerical_derivative(fun, 3) print("result == ", result)
결과
다변수 함수에 대한 수치미분
즉 x, y 에 대해 각각 수치미분하여야 합니다.
x에 대한 미분은 y를 2로 고정시키고 x값 1에서 x를 아주 미세하게 변화시켰을 때 f(x, y) 가 8만큼 변화한 것이고,
y에 대한 미분은 x를 1로 고정시키고 y값 2에서 y를 아주 미세하게 변화시켰을 때 f(x, y) 가 15만큼 변화한 것입니다.
구현
import numpy as np # f = 다변수 함수 # x = 변수 여러개를 담고 있는 numpy 객체 (배열, 행렬) # f의 변수가 5개라면 x의 길이 또한 5개 def numerical_derivative(f, x): delta_x = 1e-4 # 결과값을 저장할 배열로, 0으로 초기화함 grad = np.zeros_like(x) # x를 iterating 할 변수 it it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite']) # x 를 모두 순회 # 즉 모든 변수에 대해 각각 수치미분을 진행 while not it.finished: idx = it.multi_index # x의 원본값이 훼손될 수 있으므로 백업 tmp_val = x[idx] # x[0] 에 미세한 변화를 주고 x[idx] = float(tmp_val) + delta_x # f(x + delta_x) fx1 = f(x) x[idx] = tmp_val - delta_x # f(x - delta_x) fx2 = f(x) # 수치미분 실행 grad[idx] = (fx1 - fx2) / (2 * delta_x) # x를 원래 값으로 되돌림 x[idx] = tmp_val it.iternext() return grad def fun(val): x = val[0] y = val[1] return 2 * x + 3 * x * y + y ** 3 result = numerical_derivative(fun, np.array([1., 2.])) print("result == ", result)
결과
'인공지능' 카테고리의 다른 글
AI Linear regression 예제 (0) 2020.05.24 AI Linear regression 파이썬 구현 (0) 2020.05.24 AI Gradient descent 알고리즘 (0) 2020.05.24 AI Linear Regression (0) 2020.05.24 AI 미분과 편미분 & 연쇄법칙(Chain Rule) (0) 2020.05.23