[머신러닝] 수치미분

수치미분

함수 f가 n차원에서 scalar-valued function으로 주어졌을때 f의 gradient 계산 하는 코드에 대해서 작성한다.

코드

import numpy as np

def numerical_derivative(f,x): # n차원에서 정의된 scalar 함수 : f
    
    h = 1e-4  # difference
    grad = np.empty_like(x)   
    
    it = np.nditer(x, flags=['multi_index'])
    
    while it.finished:
        idx = it.multi_index
        tmp = x[idx]
        
        x[idx] += h
        f_plus_h = f(x)
        
        x[idx] -= h
        f_minus_h = f(x)
        
        grad[j] = (f_plus_h - f_minus_h)/(2*h)
        x[idx] = tmp
        it.iternext()

    return grad        

예제

f = lambda x : (1 - x[0]^2 - x[1]^2 )**(1/2) # 구의 윗부분 
x = np.array([1/2**(1/2), 1/2**(1/2)])       # (1/sqrt(2), 1/sqrt(2))

print('결과 : {}'.format(centered_diff(f,x)))
## 결과 : [0.70710678 0.70710678]