Be Brave, Be Humble

NumericalDerivative_Example 본문

AI/Computer Vision

NumericalDerivative_Example

해쨔니 2022. 7. 25. 21:09

[예제1] f(x) = x**2 미분

In [ ]:
import numpy as np

def numerical_derivative(f, x):    
    delta_x = 1e-4 
    grad = np.zeros_like(x)
    
    it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
    
    while not it.finished:
        idx = it.multi_index
        
        print("debug 3. idx = ", idx, ", x[idx] = ", x[idx])   
        
        tmp_val = x[idx]
        x[idx] = float(tmp_val) + delta_x
        fx1 = f(x)   # f(x+delta_x)
        
        x[idx] = float(tmp_val) - delta_x 
        fx2 = f(x)   # f(x-delta_x)
        grad[idx] = (fx1 - fx2) / (2*delta_x)
        
        x[idx] = tmp_val
        it.iternext()   
        
    return grad
In [ ]:
# 입력변수 1 개인 함수 f(x) = x**2

def func1(W):    
    
    x = W
    
    return  x**2  


# lambda function 정의
f = lambda W : func1(W) # f(W) = func1(W)

W = np.array([3.0]) # 미분하려는 현재 값

# x = 3.0 에서의 편미분 값 
ret = numerical_derivative( f, W ) 

print('type(ret) = ', type(ret), ', ret_val = ', ret) # type(ret): 디버그 위해 타입 확인
debug 3. idx =  (0,) , x[idx] =  3.0
type(ret) =  <class 'numpy.ndarray'> , ret_val =  [6.]

[예제 2] f(x,y) = 2x + 3xy + y^3 편미분

In [ ]:
# 입력변수 2 개인 함수 f(x, y) = 2x + 3xy + y^3
def func2(W):    
    
    x = W[0]
    y = W[1] 
    
    return  ( 2*x + 3*x*y + np.power(y,3) )   

# lambda function 정의
f = lambda W : func2(W)

# (x,y) = (1.0, 2.0) 에서의 편미분 값
W = np.array([1.0, 2.0]) 

ret = numerical_derivative( f, W ) 

print(ret)
debug 3. idx =  (0,) , x[idx] =  1.0
debug 3. idx =  (1,) , x[idx] =  2.0
[ 8.         15.00000001]

[예제 3]

In [ ]:
# 입력변수 4 개인 함수 
# f(w,x,y,z) = wx + xyz + 3w + zy^2
# input_data 는 행렬

def func(input_data):    
    
    w = input_data[0, 0]
    x = input_data[0, 1] 
    y = input_data[1, 0]
    z = input_data[1, 1] 
    
    return  ( w*x + x*y*z + 3*w + z*np.power(y,2) )   

# lambda function 정의
f = lambda W : func(W)

# 입력을 2X2 행렬로 구성함
input_data = np.array([ [1.0, 2.0], [3.0, 4.0] ]) 

ret = numerical_derivative( f, input_data ) 

print(ret)
debug 3. idx =  (0, 0) , x[idx] =  1.0
debug 3. idx =  (0, 1) , x[idx] =  2.0
debug 3. idx =  (1, 0) , x[idx] =  3.0
debug 3. idx =  (1, 1) , x[idx] =  4.0
[[ 5. 13.]
 [32. 15.]]

'AI > Computer Vision' 카테고리의 다른 글

Keras_Simple_Linear_Regression_Exercise_Sequential  (0) 2022.08.01
multi_variable_linear_regression  (0) 2022.08.01
Logistic_XOR_Regression  (0) 2022.07.25
LogisticRegression_Example  (0) 2022.07.25
LinearRegression_Example  (0) 2022.07.25
Comments