인공지능 AI

[머신러닝/인공지능] 수치미분(Numerical Derivative)

수치미분(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)

 

수치미분1개.py
0.00MB

다변수 함수의 수치 미분

파이썬으로 구현한 코드

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 ))