본문 바로가기

Python/DeepLearning

왜 machine learning에서는 Normal Distributions를 사용할까?

 

 나는 통계에 전혀 지식이 없고 수학과도 거리가 먼 사람이다. 공부를 하면서 슬금슬금 나타나는 Normal Distibution의 정체가 궁금해졌다. 도대체 왜 정규분포를 사용하는 것일까? 이것은 통계의 유구한 역사에서 기원하는데 대부분의 자연 현상을 설명해주기 때문이다. 14살 소녀들의 키를 조사하여 분포도를 그려보자.

 놀랍게도 평균을 중앙값으로 가지고 이와 대칭되는 분포도가 그려진다. 우리가 접할 수 있는 다른 자연 데이터들도 이와 비슷한 값을 갖는다. Machine Learning에서 사용하는 데이터들은 결정론적인 부분과 무작위적인 부분으로 이루어져 있으며 데이터의 무작위적인 부분은 정규 분포를 가지고 있다. 이러한 현상을 중심 극한 정리(central limit theorem)이라고 한다. 동일한 확률 분포를 가진 독립 확률 변수 n개의 평균의 분포는 n이 적당히 크다면 정규분포에 가까워진다는 정리이다.

 머리론 알겠는데 가슴으론 납득이 잘 안된다. 직접 실험해본다.

import matplotlib.pylab as plt
import numpy as np
from collections import Counter

sum_list = []

def random():
	a = np.array([1,2,3,4,5,6,7,8,9,10])
	b = np.random.choice(a,10,replace=True, p=None)
	c = np.sum(b)
	return c

def make_list(sum_list, x):
	count_probability = []
	
	count = Counter(sum_list)
	count_key = count.keys()
	
	for i in count.values():
		count_probability.append(i/x)
	
	draw_list = [count_key, count_probability]
	
	return draw_list

def draw_graph(draw_list, x):
	plt.bar(draw_list[0], draw_list[1])
	plt.title('generate ' + str(x) + ' of them and add them together')
	plt.show()

if __name__ == "__main__":
	x = ?
	for i in range(x):
		sum_list.append(random())
	
	draw_list = make_list(sum_list, x)
	draw_graph(draw_list, x)

1에서 10까지의 숫자 10개를 가지고 있는 리스트를 생성하여 이 들의 합을 구한다. 이후 x번 반복하여 합의 비율을 구한 뒤 그래프로 그려보았다.

 먼저 100번 시도해본다.

상당히 들쭉날쭉하다. 횟수를 늘려 1000번 시도해본다.

어느정도의 양상을 보인다. 그래프의 극한값(40 이전, 70 이후)가 많이 줄어들고 중앙 값이 늘어났다.

만번, 십만번이 넘어가면 익히 알고 있는 그래프 모양이 나타난다. 이렇게 자연적으로 생성된 수의 경우 분포도가 정규 분포를 따른 다는 것을 알 수 있다. 머신러닝에서는 이러한 자연적 현상에 기반하여 정규 분포도를 사용하는 것이다.