일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- rabbitmq
- 기초 수학
- docker
- React
- fastapi
- phpredis
- Go
- NCP
- Backbone.js
- deep learning
- webpack
- Redux
- 블레이드 템플릿
- CentOS
- nodejs
- Redis
- laravel
- javascript
- Babel
- nginx
- For
- mariadb
- php
- Node
- AWS
- Switch
- SQL
- python
- linux
- Machine Learning
- Today
- Total
개발일기
기초 수학 - 적분(Integration)의 개념(부정 적분, 정적분) 본문
머신 러닝에서 적분(Integration)이란?
적분은 함수의 넓이, 부피, 길이 등을 계산하는데 사용되는 개념으로 머신 러닝에서는 함수 그래프의 곡선 아래 영역에 대한 내용을 다룬다. 머신 러닝에서 적분은 ROC라 불리는 곡선 아래 영역을 구할 때 사용하거나 확률 변수의 기댓값을 구할 때 사용된다.
import matplotlib.pyplot as plt
import numpy as np
def f(x):
return x**2 +2*x + 1 # x^2 + 2x + 1
x = np.linspace(0, 10)
y = f(x)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_ylim(bottom=0) # 0보다 작은 y축 요소는 표시하지 않음
ax.set_xlim(right=10) # 10보다 큰 x축 요소는 표시하지 않음
ax.fill_between(x, y, alpha=0.5)
plt.show()
위의 그래프는 $ x^2 + 2x + 1 $ 함수의 그래프를 나타내면 함수의 아랫부분이 하늘색으로 칠해져 있다. 범위가 정해지지 않은 상태에서 아랫부분을 구하는 것을 부정 적분이라고 한다. 반면에 범위가 정해진 상태에서 구하는 것을 정적분이라 한다.
import matplotlib.pyplot as plt
import numpy as np
def f(x):
return x**2 +2*x + 1 # x^2 + 2x + 1
x = np.linspace(0, 10)
y = f(x)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_ylim(bottom=0) # 0보다 작은 y축 요소는 표시하지 않음
ax.set_xlim(right=10) # 10보다 큰 x축 요소는 표시하지 않음
x_fill = np.linspace(3, 8) # x 영역 지정
y_fill = f(x_fill)
ax.fill_between(x_fill, y_fill, alpha=0.5)
plt.show()
위와 같이 영역이 정해진 함수의 적분을 구하는 것을 정적분이라 한다.
수식
적분을 수식으로 표현하면 $ \int dx $ 로 표현하며 $ dx $ 부분에 함수가 들어간다. $ \int $ 만 있으면 부정 적분을 나타내며 $ \int_{a}^{b} dx $ 와 같이 a, b로 범위를 지정하는 기호가 표시되면 정적분을 의미한다.
적분의 계산 방법은 식으로 $ \int dx = \frac{x^{n+1}}{n+1} + C $ 이렇게 표현한다. 미분은 제곱 법칙에 의해 지수가 $ n-1 $ 이 되지만 적분은 이와 반대로 $ n+1 $이 되며 분모에서 $ n+1 $ 이 위치하게 된다. 지수가 $ n+1 $ 이 되는 규칙으로 인해 지수가 -1인 $ \int dx^{-1} $ 함수는 적분할 수 없다.
마지막으로 상수 C를 더하는데 기존에 존재하던 상수가 미분 과정을 통해 사라졌을 수도 있기 때문에 C를 더한다. 미분 법칙에 의하면 상수항을 미분하면 0이 되기 때문이다. 그렇기 때문에 적분을 할 때는 없어졌을지도 모르는 상수항에 대한 것도 염두해 둬야 한다. 이렇게 상수항을 더하는거는 부정 적분에서만 사용하고 정적분에서는 상수항을 더하지 않는다. 정적분은 범위가 정해진 상태이기 때문에 상수항이 적분 결과에 영향을 미치지 않기 때문이다. 또한 적분하는 함수가 $ 5x^2 $와 같이 변수 앞에 상수가 존재하는 함수를 볼 수 있다. 상수 법칙에 따라 상수를 적분 밖으로 빼버리고 적분을 한다. 그 후 적분 결과에 상수를 곱한다.
부정 적분(Indefinite Integral) 계산
적분 공식을 통해 부정 적분 $ \int 5x^2dx $ 를 계산해보자.
- 상수 법칙에 의해 상수를 앞으로 빼낸다. $ 5\int x^2dx $
- $ x^2 $에 대한 적분을 진행한다. $ n $은 2이므로 $ n+1 $의 값은 3이다.
- 분자는 $ x^3 $ 이 되고 분모는 3이 된다. $ \frac{x^3}{3} $
- 미리 빼둔 상수 5를 곱한 후 상수항 C를 더한다. $ \frac{5x^3}{3} + C $
또한 $ 3x^4 + 5x $ 와 같이 다항 함수일 경우 합의 법칙에 따라 각 항을 따로 적분한다.
- $ \int (3x^4 + 5x)dx $ 를 따로 분리하여 $ \int (3x^4 + 5x)dx = \int (3x^4)dx + \int (5x)dx $ 로 표현한다.
- $ \int (3x^4)dx $ 의 적분은 $ \frac{3x^5}{5} $ 가 된다.
- $ \int (5x)dx $ 의 적분은 $ \frac{5x^2}{2} $ 가 된다.
- 두항을 더 한 후, 상수항 C를 더한다. $ \frac{3x^5}{5} + \frac{5x^2}{2} + C $
정적분(Definite Integral) 계산
정적분은 곡선 아래의 특정한 범위 안의 값을 구하는 것이다. 간단하게 $ \int_{3}^{8} (x)dx $ 함수의 정적분을 구해보자. 정적분의 공식은 $ \int_{x_1}^{x_2}f(x)dx $ 와 같이 표현한다. 아랫부분 $ x_1 $ 이 범위의 시작점이고 윗부분 $ x_2 $ 가 범위의 마지막점이다. 즉, 3~8 사이 범위의 정적분을 구하면 된다.
- 먼저 부정 적분을 구할 때와 동일하게 $ \int (x)dx $ 의 부정 적분을 구한다.
- 구해진 부정 적분 $ \frac{x^2}{2} + C $ 에 $ x_1 $, $ x_2 $ 값인 3과 8을 각각 대입한다.
- 3을 대입하면 $ \frac{9}{2} + C $ 가 된다.
- 8을 대입하면 $ \frac{64}{2} + C $ 로 $ 32 + C $ 가 된다.
- 끝지점 값에서 시작 지점 값을 뺀다. $ (32 + C) - (\frac{9}{2} + C) = \frac{55}{2} $ 로 정적분을 구할 수 있다.
즉 정적분은 끝지점의 부정 적분 값에서 시작 지점의 부정 적분 값의 차로 구할 수 있다.
부정 적분 - Sympy
부정 적분은 Python의 sympy 라이브러리를 통해 구할 수 있다.
# Indefinite integral
import sympy as sp
x = sp.symbols('x')
def f(x):
return 3*x**4 + 5*x
f_integrate = sp.integrate(f(x), x)
print(f_integrate)
# 3*x**5/5 + 5*x**2/2
위에서 구한 $ \int (3x^4 + 5x)dx $ 의 부정 적분 값과 비교하면 값이 동일한 것을 확인할 수 있다.
정적분 - Scipy
Python으로 정적분을 구하려면 sympy대신 scipy를 사용해야 한다. sympy는 정적분을 직접 계산하는 함수를 제공하지 않는다. 반면에 scipy는 주로 정적분과 같은 수치적 미분을 위한 함수를 제공한다.
# Definite integral
from scipy.integrate import quad
def f(x):
return x
f_integrate = quad(f, 3, 8)
print(f_integrate)
# (27.5, 3.0531133177191805e-13)
- quad(): quadrature의 줄임말로 구적법을 의미한다. 그래프의 면적, 부피 함수 등의 정적분을 근사하는 방법으로 scipy에서 사용 가능한 함수다.
- 첫번째 파라미터에는 식을 담고 있는 함수 또는 변수를 대입한다.
- 두번째 파라미터에는 정적분의 시작점을 입력한다.
- 세번째 파라미터에는 정적분의 마지막점을 입력한다.
결과 값을 보면 27.5가 나오는데 $ 55/2 $ 와 동일한 값이다. 결과의 두번째로 나온 결과 값은 이를 통해 계산한 수치 적분의 오류 추정치를 의미한다. 직접 종이에 연필로 정적분을 계산하면 오류의 가능성이 적지만 python 라이브러리와를 사용하여 수치 적분을 하면 오류가 발생할 수도 있다. 이러한 적분 결과의 신뢰성을 나타내며 오류 추정치가 낮을수록 정확한 결과라는 것을 의미한다. 이 결과로 나온 오류 추정치는 매우매우 낮은 값이므로 해당 정적분 값이 정확하다고 결론 내릴 수 있다.
참고 사이트:
https://matplotlib.org/stable/gallery/showcase/integral.html
https://docs.scipy.org/doc/scipy/tutorial/integrate.html
https://colab.research.google.com/drive/1JIfe6BgdSdUPK0Sl2K7YJLBsJTSPsoDc?usp=sharing
https://www.buymeacoffee.com/flashback_music
'AI > 기초 수학' 카테고리의 다른 글
기초 수학 - ROC Curve와 AUC (0) | 2024.07.15 |
---|---|
기초 수학 - 혼동 행렬(The Confusion Matrix) (0) | 2024.07.15 |
기초 수학 - 편미분과 선형 회귀 모델 응용 (0) | 2024.07.07 |
기초 수학 - 편미분의 연쇄 법칙(Chain Rule In Partial Derivative) (0) | 2024.07.03 |
기초 수학 - 편미분(Partial Derivative) (0) | 2024.06.29 |