반응형
중앙차분
전향차분, 후향차분보다 값이 정확하다.
delta x는 10의 -4승, 1e-4 이용
너무 작은 값을 이용하면 실수 계산에서 오류나 나타날 수 있다.
단변수 함수의 수치미분
[함수]
f(x) = x^2
f'(x) = 2x
def my_func(x):
return x **2
def numerical_derivative(f, x):
delta_x = 1e-4
return (f(x+delta_x) - f(x-delta_x)) / (2 * delta_x)
print(numerical_derivative(my_func, 5)
>> 9.999999999976694
numberical_derivative의 인자로 my_funce라는 함수를 넣어주었는데
이는 파이썬이 일급함수(first-classes funciton)을 지원하기 때문이다.
일급함수 first-classes function
함수가 변수에 저장될 수 있다.
실제로는 변수에 저장되는 것은 아니고 변수가 함수의 레퍼런스가 되는 것이다.
때문에 함수 이름을 변수처럼 사용할 수 있고 함수를 다른 함수의 인자로 사용할 수 있게된다.
print(my_func)를 해보면 주소값이 나온다.
>> <function my_func at 0x000001AB4C3C5940>
다변수 함수의 수치미분, 편미분
[함수]
f(x,y) = 2x + 3xy + y^3
def my_func(input_value):
x = input_value[0]
y = input_value[1]
return 2*x + 3*x*y + y ** 3
필요한 변수를 my_func(x, y) 이런 방식으로 입력받는다면
이변수, 삼변수 등 변수 개수가 다른 경우마다 다르게 미분 함수를 만들어 주어야 하기 때문에
input_value로 지정하여 튜플, 리스트, ndarray로 입력받을 수 있게 한다.
import numpy as np
def numerical_derivative(f, x) : # x : ndarray [1.0, 2.0]
delta = 1e-4
derivative = np.zeros_like(x) # derivative_x : ndarray [0.0, 0.0]
# iterator를 이용해서 입력변수 x에 대한 편미분을 수행
it = np.nditer(x, flags=['multi_index'])
while not it.finished :
idx = it.multi_index
tmp = x[idx] # tmp : 1.0
x[idx] = tmp + delta # x : [1.0001, 2.0]
fx_plus_delta = f(x)
x[idx]= tmp - delta # x : [0.9999, 2.0]
fx_minus_delta = f(x)
derivative[idx] = (fx_plus_delta - fx_minus_delta) / (2*delta)
x[idx] = tmp # x : [1.0, 2.0]
it.iternext()
return derivative
result = numerical_derivative(my_func, np.array([1.0, 2.0]))
print(result)
>> [ 8. 15.00000001]
반응형
'AI' 카테고리의 다른 글
[ML] Linear Regression 구현, sklearn과 비교 (0) | 2022.03.29 |
---|---|
[ML] Linear Regression (0) | 2022.03.28 |
Machine Learning 개요 (0) | 2022.03.24 |
기술통계 - 2차원 데이터 (0) | 2022.03.24 |
기술통계 - 1차원 데이터 (0) | 2022.03.23 |