수식없이 이해하는 Gaussian Mixture Model


/* 2017.8.4 by. 3개월 */


개요


머신러닝에서 자주 사용되는 Gaussian Mixture Model(GMM)을 알아보겠습니다. GMM은 머신러닝에서 Unsupervised Learning(클러스터링)에 많이 활용이 됩니다. 하지만 다른 K-means와 같은 클러스터링 알고리즘과는 다르게 통계적인 용어나 수식 때문에 한 번에 이해하기가 어렵습니다. 이 포스팅에서는 수식 없이 기초적인 통계 수준에서 Gaussian Mixture Model을 이해할 수 있게 글을 써보려고 합니다.


우선 GMM을 알기 위해서는 Mixture Model을 알아야합니다. Mixture Model 전체 분포에서 하위 분포가 존재한다고 보는 모델입니다. 즉, 데이터가 모수를 갖는 여러개의 분포로부터 생성되었다고 가정하는 모델입니다. 책에서는 보통 이를 두고, "Unsupervised Learning의 모수적 접근법"이라고 합니다. 


이 중에서 가장 많이 사용되는 가우시안 믹스쳐 모델(GMM)은 데이터가 K개의 정규분포로부터 생성되었다고 보는 모델입니다.


<표준 정규분포의 pdf>


샘플 데이터 생성


예를 들어, A, B, C라는 세 종류의 정규분포의 PDF(probability density function)를 상상해봅시다. GMM은 데이터가 이 3가지 정규분포중 하나로부터 생성되었으며, 또 그 안에서 random하게 정규분포 형태를 갖고 생성되었다고 보는 모델입니다.


<3개의 정규분포의 pdf>


정규분포 1 : 평균 = -0.5, 표준편차 = 0.2 (파란색)

정규분포 2 : 평균 = -0.1, 표준편차 = 0.07 (주황색)

정규분포 3 : 평균 = 0.2, 표준편차 = 0.13 (녹색)


<3개의 정규분포로부터 랜덤하게 생성된 데이터>


정규분포 1로부터 2000개, 정규분포 2로부터 5000개, 정규분포 3으로부터 10000개의 데이터를 랜덤하게 생성 후, 분포를 알아보기 위해서 그린 히스토그램입니다. 지금 우리는 데이터가 어느 분포로부터 나왔는지를 알기 때문에 색을 통해서 데이터를 구분하고 있습니다. 하지만 우리가 실제로 보는 데이터는 바로 이 데이터들을 모두 합친 모양일 것입니다.


<실제 업무에서 보게되는 데이터>


세 종류의 데이터를 모두 합치면 위와 같은 모양이 됩니다. 여러분들은 이 데이터를 보고 "아 왠지 데이터가 3개의 정규분포로부터 생성되었을 것 같아." 라고 생각하고, GMM을 적용시키면 되는 것입니다. 그림을 보면 무엇이 떠오르시나요?


첫 번째, 3개의 정규분포의 평균과, 분산을 어느정도 짐작할 수 있습니다.

두 번째, 각각의 분포로부터 생성되는 데이터의 양의 차이가 있습니다.


즉, 우리가 알아야할 건 총 9개입니다. 데이터를 통해 이 9개의 모수를 알아내야합니다. (세 가지 분포의 평균과 모수, 세 가지 분포의 Weight) 이 9개의 모수를 통해 데이터의 분포를 설명할 수 있는 혼합 PDF를 만들어낼 수 있는 것이죠.


모수 추정


GMM에서의 모수는 두 가지 종류가 있습니다. 첫 번째는 3가지 정규분포 중 확률적으로 어디에서 속해있는가를 나타내는 Weight 값이고, 두 번째, 각각의 정규분포의 모수(평균, 분산)입니다. 첫 번째 종류의 모수를 잠재변수 라고 부르며, 잠재변수가 포함된 모델은 Mixture Model에서의 모수 추정은 MLE(maximum likelihood estimation)으로 구할 수 없기 때문에 EM(Expectation Maximazation)이라고 부르는 알고리즘을 통해 iterative하게 구하게 됩니다. (왜냐하면 잠재변수가 포함되었기 때문에 likelihood function을 미분할 수가 없기 때문입니다. - 이 부분은 EM 알고리즘을 공부하시면 됩니다.) GMM에 대한 이해가 우선이므로, 이 포스트에서는 EM 알고리즘을 통해 Mixture Model의 모수를 추정하는 방법은 다루지 않겠습니다.



실제 모수와 추정된 모수의 비교


모수 추정은 파이썬 sklearn 패키지의 GaussianMixture 모듈을 이용하였습니다.


실제 모수


Weight1 = 2000/(2000+5000+10000) = 0.117

Weight2 = 5000/(2000+5000+10000) = 0.29

Weight3 = 10000/(2000+5000+10000) = 0.588

평균1 = -0.5

평균2 = -0.1

평균3=  0.2

표준편차1 = 0.2

표준편차2 = 0.07

표준편차3 = 0.13


추정된 모수


Weight1^ = 0.100714

Weight2^ = 0.39059817

Weight3^ = 0.50868783

평균1^ = -0.54073433

평균2^ = -0.07930454

평균3^ =  0.22779283 

표준편차1^ = 0.1680513611965104

표준편차2^ = 0.094137665150565528

표준편차3^ =  0.11380030755670215





데이터의 분포와 데이터를 통해 추정한 모수를 통해 그린 혼합 모델의 PDF입니다. 물론 왼쪽 그림은 히스토그램이라 Y축이 빈도이고, 오른쪽그림은 PDF이기 때문에 scale은 다르지만 모양이 거의 같다는 것을 알 수 있습니다. sklearn의 GaussianMixtureModel 패키지가 모수를 잘 추정해준 것입니다. 혼합모델의 PDF는 구해진 모수를 통해 구할 수 있는데 혼합모델PDF = Weight1*정규분포1PDF + Weight2*정규분포2PDF + Weight3*정규분포3PDF로 구할 수 있습니다.



클러스터링


모수 추정을 완료하였으면 클러스터링은 쉽습니다. 어떤 데이터를 관측하였을 때, "이 데이터가 어떤 분포에서 왔는가?" 를 확률적으로 알아내기만 하면 됩니다. 즉, 예를 들어 데이터 -1.0을 관찰하였을 때, 정규분포1에서 -1.0을 관찰하였을 확률, 정규분포2에서 -1.0을 관찰하였을 확률, 정규분포3에서 -1.0을 관찰하였을 확률을 비교하여 가장 큰 확률을 갖는 정규분포로 이 데이터를 분류하면 됩니다. 그러면 어떤 정규분포에서 그 데이터를 관찰하였을 확률을 어떻게 구할까요? 바로 p-value를 이용해서 구할 수 있습니다.



  • 행인1 2018.08.01 20:30

    잘~ 읽고 갑니다~

  • 박경현 2019.01.07 15:53

    좋은 글 감사합니다.

    클러스터링 부분에서 의문점이 있어 질문 드립니다.
    어떤 데이터를 관측하였을 때 분포 1에서 관측되었을 확률, 2,3 에서 관측되었을 확률 각각을 구하여 비교한다고 하셨습니다.
    이때 관측되었을 확률이 어떻게 계산되는지 궁금합니다.
    이 확률 계산 시에 단순히 p-value만 고려해서 비교하는건가요? 여기서 weight 가 들어가야 할 것 같은데 들어가지 않는 이유가 무엇인지 궁금합니다.

    감사합니다.

  • 학생1 2021.02.12 16:30

    잘 배워갑니다 감사합니다~