수치미분(Numerical Derivative
C언어나 파이썬같은 프로그래밍언어를 이용하여
미분값, 즉 입력 값이 아주 미세하게 변할 때 함수 f는 얼마나 변하는지 계산하는 것.
변수가 1개인 함수의 수치 미분
파이썬으로 구현한 코드
import numpy as np
#미분공식 구현
def simple_derivative(f,var): #f는 외부에서 lamda등으로 정의한 함수, x는 미분을 알고자하는 입력값
delta=1e-5 #극한 구현
diff_val = ( f(var+delta) - f(var-delta) ) / (2*delta) #미분값 계산
return diff_val
#미분 대상 함수
def func1(x):
return x**2
ret_val=simple_derivative(func1,3.0)
print("result=",ret_val)
다변수 함수의 수치 미분
파이썬으로 구현한 코드
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)
#print("debug 1. initial input variable =", x)
#print("debug 2. initial grad =", grad)
# print("=======================================")
#x를 iterating할 변수 it
it=np.nditer(x, flags=['multi_index'],op_flags=['readwrite'])
#x를 모두 순회
#즉 모든 변수에 대해 각각 수치미분 수행
while not it.finished:
idx = it.multi_index
# print("debug3. idx=",idx,",x[idx]=",x[idx])
#x의 원본값이 변형되므로 백업
tmp_val=x[idx]
#x에 미세한 변화
x[idx]=float(tmp_val)+delta_x
fx1=f(x) #f(x-delta_x)
x[idx]=tmp_val-delta_x
fx2=f(x)
grad[idx]=(fx1-fx2)/(2*delta_x)
#print("debug 4. grad[idx]=",grad[idx])
# print("debug 5. grad=",grad)
x[idx]=tmp_val
it.iternext()
return grad
# 입력변수 1 개인 함수 f(x) = x**2
def func1(input_obj):
x=input_obj[0]
return x**2
#x=3.0에서의 편미분값
print("단일함수:",numerical_derivative(func1, np.array([3.0])))
# 입력변수 4 개인 함수
# f(w,x,y,z) = wx + xyz + 3w + zy^2
# input_obj 는 행렬
def func2(input_obj):
w = input_obj[0, 0]
x = input_obj[0, 1]
y = input_obj[1, 0]
z = input_obj[1, 1]
return ( w*x + x*y*z + 3*w + z*np.power(y,2) )
# 입력을 2X2 행렬로 구성함
input = np.array([ [1.0, 2.0], [3.0, 4.0] ])
print("다변수함수:",numerical_derivative( func2, input ))
'인공지능 AI' 카테고리의 다른 글
[머신러닝/인공지능] 선형회귀 예제 _단일변수/다변수 (0) | 2020.06.06 |
---|---|
[머신러닝/인공지능] 경사하강법(Gradient Descent Algorithm) (0) | 2020.06.06 |
[머신러닝/인공지능]편미분(Partial Derivative)과 체인룰(Chain Rule) (0) | 2020.06.05 |
[머신러닝/인공지능] 머신러닝 기초 개념_지도학습/비지도학습/선형회귀/손실함수/오차/가중치/바이어스 (0) | 2020.06.05 |
[딥러닝/머신러닝]논리게이트 XOR문제(XOR problem) (0) | 2020.06.05 |