GNM(Gaussian Mixture Model)


GNM 군집화는 군집화를 적용하고자 하는 데이터가 여러 개의 가우시안 분포를 섞어서 생성된 모델로 가정해 수행하는 방식이다. 정규 분포로도 알려진 가우시안 분포는 좌우 대칭형의 종(Bell) 형태를 가진 연속 확률 함수 이다.

GNM은 데이터를 여러 개의 가우시안 분포가 섞인 것으로 간주한다.
섞인 데이터 분포에서 개별 유형의 가우시안 분포를 추출한다. 먼저 아래 사진처럼 세 개의 가우시안 불포를 합치면 다음과 같은 형태가 될 것이다. ( 파란색 선 : 개별 가우시안 분포, 빨간색선 : 합친 가우시안 분포 )

군집화를 수행하려는 실제 데이터 셋의 데이터 분포도가 다음과 같다면 쉽게 이 데이터 셋이 정규 분포 A, B, C를 합쳐서 된 데이터 분포도임을 알 수 있다.

전체 데이터 셋은 서로 다른 정규 분포 형태를 가진 여러 가지 확률 분포 곡선으로 구성될 수 있으며,이러한 서로 다른 정규 분포에 기반해 군집화를 수행하는 것이 GNM 군집화 방식이다.

가령 1000개의 데이터 셋이 있다면 이를 구성하는 여러 개의 정규 분포 곡선을 추출하고, 개별 데이터가 이 중 어떤 정규 분포에속하는지 결정하는 방식이다.

이와 같은 방식은 GNM 에서는 모수 추정이라고 하는데, 모수 추정은 대표적으로 2가지를 추정하는 것이다.

  • 개별 정규 분포의 평균과 분산
  • 각 데이터가 어떤 정규 분포에 해당되는지의 확률

이러한 모수 추정을 위해 GNM은 EM(Expectation and Maximization) 방법을 적용한다. EM 알고즘은 복잡하니 생략한다.
사이킷런은 GNM의 EM 방식을 통한 모수 추정 군집화를 지원하기 위해 GaussianMixture 클래스를 지원한다.

 

GMM 을 이용한 붓꽃 데이터 셋 클러스터링


GNM은 확률 기반 군집화이고 K-평균은 거리 기반 군집화 이다. 이번에는 붓꽃 데이터 셋으로 이 두가지 방식을 이용해 군집화를 수행한 뒤 양쪽 방식을 비교해 보자.

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline

iris = load_iris()
feature_names = ['sepal_length','sepal_width','petal_length','petal_width']

# 보다 편리한 데이타 Handling을 위해 DataFrame으로 변환
irisDF = pd.DataFrame(data=iris.data, columns=feature_names)
irisDF['target'] = iris.target

GaussianMixture 객체의 가장 중요한 초기화 파라미터는 n_components 이다. n_components는 gaussina mixture의 모델의 총 개수이다. K – 평균의 n_clusters와 같이 군집의 개수를 정하는 데 중요한 역할을 수행한다. n_components를 3으로 설정하고 GaussianMixture로 군집화를 수행한다.

GaussianMixture 객체의 fit(데이터셋) 과 predict(데이터셋)을 수행해 군집을 결정한 뒤 irisDF 에 ‘gmm_cluster’ 칼럼 명으로 저장하고 나서 타깃별로 군집이 어떻게 매핑됐는지 확인해 보자.

from sklearn.mixture import GaussianMixture

gmm = GaussianMixture(n_components=3, random_state=0).fit(iris.data)
gmm_cluster_labels = gmm.predict(iris.data)

# 클러스터링 결과를 irisDF 의 'gmm_cluster' 컬럼명으로 저장
irisDF['gmm_cluster'] = gmm_cluster_labels
irisDF['target'] = iris.target

# target 값에 따라서 gmm_cluster 값이 어떻게 매핑되었는지 확인. 
iris_result = irisDF.groupby(['target'])['gmm_cluster'].value_counts()
print(iris_result)
target  gmm_cluster
0       0              50
1       2              45
        1               5
2       1              50
Name: gmm_cluster, dtype: int64

이는 어떤 알고리즘에 더 뛰어나다는 의미가 아니라 붓꽃 데이터 셋이 GMM 군집화에 더 효과적이라는 의미이다.

K-평균은 평균 거리 중심으로 중심을 이동하면서 군집화를 수행하는 방식이므로 개별 군집 내의 데이터가 원형으로 흩어져 있는 경우에 매우 효과적으로 군집화가 수행될 수 있다.

 

본문 내용은 파이썬 머신러닝 완벽 가이드 (권철민 저)을 요약정리한 내용입니다.

'머신러닝' 카테고리의 다른 글

추천시스템  (0) 2020.08.24
DBSCAN  (0) 2020.08.24
평균이동(Mean Shift)  (0) 2020.08.24
군집 평가 - 실루엣 분석  (2) 2020.08.24
군집화 - K-Means  (0) 2020.08.24

+ Recent posts