01-05 표준정규분포
def) 표준정규분포(Standard Normal Distribution): 평균이 0이고 분산이 1인 표준화된 정규분포
지난 포스트에서 실생활의 데이터는 많이들 정규분포로 근사한다고 배웠습니다. 이러한 정규분포들을 획일적으로 비교하기 위해, 평균이 0, 분산이 1이 되게끔 데이터의 스케일을 조정하고는 합니다. 이 과정을 표준화(standardization)라고 하며, 이렇게 표준화된 정규분포를 표준정규분포라고 합니다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
np.random.seed(123)
mu = 0
sigma = 1
x = np.linspace(-5, 5, 1000)
plt.figure(figsize=(16, 9))
plt.plot(x, norm.pdf(x, loc=0, scale=1), label=r'N(0, $1^2$)')
plt.xlabel(r'$x$', fontsize=12)
plt.ylabel(r'$f(x)$', fontsize=12)
plt.title('Standard normal Distribution\n' + r'$\mu$'+f' = {mu}, '+ '$\sigma$' + f' = {sigma}')
plt.grid()
plt.legend(loc='upper left')
plt.show()
지난 포스트에서 사용한 SciPy 라이브러리의 norm
패키지를 이용해 그려보면 위 그림과 같습니다. 평균이 0이기 때문에 $x=0$ 직선에 대하여 대칭인 것을 볼 수 있습니다. 또한, $x=0$일 때 확률밀도함수 $f\left(x=0\right)$는 0.4라고 나오네요. 이 값이 어떻게 나온 걸까요?
잠시 기억을 더듬어 정규분포의 확률밀도함수 공식을 다시 떠올려보겠습니다.
$$f\left(x\right)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{1}{2\sigma^2}\left(x-\mu\right)^2}$$
여기서 $\mu=0$, $\sigma=1$를 대입하고, 표준정규분포임을 나타내기 위해
무슨 사유인지는 몰라도
확률변수를 $Z$라고 하면, 위의 수식은 다음과 같습니다.
$$f\left(z\right)=\frac{1}{\sqrt{2\pi}}e^{-\frac{1}{2}z^2}\ \left(Z\sim N\left(0,1\right)\right)$$
여기에 $z=0$을 대입해 계산하면 약 0.4가 나옵니다. 추가로, 위 그래프에서 $P\left(Z\le 1\right)$일 확률을 구하면
$$P\left(Z\le 1\right)=P\left(Z\le 0\right) + P\left(0\le Z\le 1\right) \approx 0.5 + 0.3413 \approx 0.8413$$
이라고 나타납니다. 정규분포는 특정한 점에서의 확률을 계산하는 것이 아닌 특정 구간에서의 확률을 구하는 것이기 때문에 각 구간에서의 확률값을 일일이 계산해야 하는 번거로움이 있는데, 표준화를 거쳐서 표준정규분포로 만들어주면 서로 다른 정규분포를 갖는 두 확률변수에 대한 확률 비교도 간단해집니다. 모든 정규분포는 이 표준정규분포의 상수배를 평균만큼 $x$축 방향으로 평행이동 시킨 형태이기 때문입니다. 아예 $z$의 값에 따라 확률밀도함수의 값을 정리해놓은 표준정규분포표(standard normal distribution table)이 있을 정도니까요.
좀 더 정확히는 표준정규분포표는 $z$ 값에서의 누적분포함수(cumulative distribution function, CDF) 값을 정리해놓은 것입니다. 누적분포함수는 해당 확률변수가 특정 값보다 작거나 같을 확률을 나타내는 함수입니다. 파이썬에서 그릴 때는
norm
패키지의cdf
메서드를 이용합니다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
np.random.seed(123)
mu = 0
sigma = 1
x = np.linspace(-5, 5, 1000)
plt.figure(figsize=(16, 9))
plt.plot(x, norm.cdf(x, loc=0, scale=1), label=r'N(0, $1^2$)')
plt.xlabel(r'$x$', fontsize=12)
plt.ylabel(r'$f(x)$', fontsize=12)
plt.title('Cumulative distribution function of standard normal Distribution\n' + r'$\mu$'+f' = {mu}, '+ '$\sigma$' + f' = {sigma}')
plt.grid()
plt.legend(loc='upper left')
plt.show()
딥러닝에서의 입력 정규화
ML과 딥러닝 분야에서 입력 데이터를 정규화(normalization) 또는 표준화(standardization) 시켜주는 작업은 굉장히 중요합니다. 예를 들어, 사용되는 데이터의 특성 중 하나는 100 단위에서 변화하는데, 다른 하나의 특성은 1 단위에서 변화하고, 또다른 하나는 0.01 단위에서 변화한다고 하면 ML 모델이 그 특성이 어떤 영향을 가지는지 잘못 학습할 우려가 있습니다. 뿐만 아니라 학습 속도에도 영향을 줄 수 있기 때문에 모든 특성이 같은 스케일을 갖도록 정규화 또는 표준화 작업을 거쳐야 합니다. 이러한 과정을 전처리(preprocessing)이라고 합니다.
정규화는 모든 데이터를 0부터 1까지의 값으로 스케일 조정하는 것이고, 표준화는 데이터가 표준정규분포를 따르게끔 변형 시켜주는 겁니다. 공식은 아래와 같습니다.
$$x_{std}=\frac{x-\mu}{\sigma}$$
파이썬에서는 NumPy 라이브러리의 함수로 평균과 표준편차를 구하고 계산하거나, 사이킷런(Scikit-learn) 라이브러리의 StandardScaler
메서드를 사용해서 구합니다. 여기서는 넘파이 라이브러리로 평균과 표준편차를 구한 뒤 직접 표준화를 진행하겠습니다.
import numpy as np
x1 = np.array([x**2 for x in range(8)])
x2 = np.array([2, 6, -10, 9, 3, 15, 1, 4.13])
x1_std = (x1-np.mean(x1)) / np.std(x1)
x2_std = (x2-np.mean(x2)) / np.std(x2)
print(np.mean(x1_std), np.std(x1_std))
print(np.mean(x2_std), np.std(x2_std))
5일차 후기
한 주가 다 갔습니다. 하지만 챌린지 must go on....!
* 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'[패스트캠퍼스 환급챌린지]딥러닝 > Chapter 1. 통계' 카테고리의 다른 글
[패스트캠퍼스][환급 챌린지]Chapter 1. 딥러닝을 위한 통계 01-07 결합확률과 주변확률 (1) | 2023.02.26 |
---|---|
[패스트캠퍼스][환급 챌린지]Chapter 1. 딥러닝을 위한 통계 01-06 독립변수와 종속변수 (0) | 2023.02.25 |
[패스트캠퍼스][환급 챌린지]Chapter 1. 딥러닝을 위한 통계 01-04 연속확률분포 (0) | 2023.02.23 |
[패스트캠퍼스][환급챌린지] Chapter 1. 딥러닝을 위한 통계 01-03 이산확률분포 (1) | 2023.02.22 |
[패스트캠퍼스][환급 챌린지]Chapter 1. 딥러닝을 위한 통계 01-02 확률변수와 확률분포 (0) | 2023.02.21 |