데이터 한 그릇

군집화) GMM(Gaussian Mixture Model) 본문

머신러닝/군집화

군집화) GMM(Gaussian Mixture Model)

장사이언스 2021. 5. 21. 17:48
  • GMM(Gaussian Mixture Model) 소개
  • GMM과 K-평균 비교

GMM 소개

 

  GMM은 분석 대상의 데이터 셋이 여러 개의 가우시안 분포를 가지고 있는 데이터들의 결합으로 생성됐다는 가정하에서 군집화를 수행하는 방식을 말한다. 만일 분석 데이터 셋이 세 개의 가우시안 분포가 합쳐져 있다고 가정해보자. GMM분석은 먼저 전체의 데이터 셋에서 개별 가우시안 분포를 추출한다. 

 

  만일 정규분포 여러개가 합쳐진 데이터 셋이라면 전체 데이터 셋의 분포모양을 통해서 그러한 사실을 쉽게 파악 가능하다.(분포의 모양 때문에) 만일 각각의 분포를 추출해서 분석을 하게 되면, 각각의 군집을 따로 분석한 것과 같다. 결국 GMM군집화 방식은 LABEL들이 추출된 각각의 분포 중에 어디에 속하는지 결정하는 방식이다.

 

파이썬 머신러닝 완벽가이드 434pg

 

파이썬 머신러닝 완벽가이드 434pg

 

 

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']

iris_df = pd.DataFrame(data = iris.data, columns = feature_names)
iris_df['target'] = iris.target

 

  앞서 처럼 군집화를 하기 위해서 아이리스 데이터를 데이터 프레임화 한다.

 

from sklearn.mixture import GaussianMixture

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

iris_df['gmm_cluster'] = gmm_cluster_labels
iris_df['target'] = iris.target

iris_result = iris_df.groupby(['target'])['gmm_cluster'].value_counts()
print(iris_result)

 

 

sklearn.mixture에서 GaussianMixture를 import 한다. n_cluster가 아니라 n_components로 군집 개수를 설정한다. 그리고 예측한 결과를 gmm_cluster에 집어넣는다. 그 후 그룹화를 통해서 정확도를 확인한다.

 


GMM과 K-평균의 비교

 

  k-means 같은 경우에는 데이터의 분포가 원형일 때 분석의 성능이 좋다. 만일 mark_blobs로 군집을 만들 때 표준편차를 작게 설정한다면, 데이터의 분포는 원형의 모습을 가지게 된다. 하지만 k-means는 데이터가 길쭉한 타원형으로 늘어선 경우에 군집화를 잘 수행하지 못한다. 

 

from sklearn. datasets import make_blobs

X,y = make_blobs(n_samples = 300, n_features = 2, centers = 3, cluster_std = 0.5, random_state = 0)

transformation =[[0.60834549,-0.63667341],[-0.40887718,0.85253229]]
X_aniso = np.dot(X, transformation)

clusterDF = pd.DataFrame(data = X_aniso, columns =['ftr1','ftr2'])
clusterDF['target'] = y
visualize_cluster_plot(None,clusterDF, 'target', iscenter = False)
plt.savefig('cluster5')

 

군집화 데이터 셋을 make_blobs을 통해서 만들어 보고 이 데이터를 조작하기로 한다. make_blobs에서 샘플을 300개 피처를 2개로 설정을 하고 군집 중심점을 3개로 지정한다. 데이터의 분포는 원형이 아닐 경우에 kmeans의 성능이 떨어지는 것을 보이고 싶기 때문에 원형이 아닌 분포로 만든다.

 

  우리가 만든 데이터 군집 세 개는 데이터의 분포가 원형이 아니다. 따라서, kmeans의 성능은 떨어지게 된다.

 

kmeans = KMeans(3, random_state = 3)
kmean_labels = kmeans.fit_predict(X_aniso)
clusterDF['kmeans_labels'] = kmean_labels

visualize_cluster_plot(kmeans, clusterDF, 'kmeans_labels',iscenter = True)
plt.savefig('cluster6')

군집화 분류가 제대로 되지 않았음이 보인다.

 

gmm = GaussianMixture(n_components = 3, random_state = 0)
gmm_label = gmm.fit(X_aniso).predict(X_aniso)
clusterDF['gmm_label'] = gmm_label

visualize_cluster_plot(gmm, clusterDF, 'gmm_label', iscenter = False)

GMM분포, 가우시안 분포를 이용한 군집화를 통해서 분류가 잘 된 모습을 볼 수 있다.

 

 

 

=> 분포의 모양이 원형일 경우 K-MEANS 유용, 그 이외에 모양일 경우 GMM유용

 

'머신러닝 > 군집화' 카테고리의 다른 글

Customer Personality Analysis  (0) 2021.12.08
군집화)평균 이동  (0) 2021.05.26
군집화)DBSCAN 군집화  (0) 2021.05.25
군집화 개요, k-평균 알고리즘  (0) 2021.05.21
Comments