데이터로그😎

KMeans, GMM 본문

머신러닝/비지도 학습

KMeans, GMM

지연v'_'v 2023. 9. 5. 17:09

KMeans vs GMM

  k-means GMM(Gaussian Mixture Model)
군집 개수 군집 개수 parameter 사전 설정
군집 방식 거리 기반 확률 기반
언제 사용? 클러스터 개수를 미리 알고 있을 때
진행 과정
  • 군집 개수를 n_cluster 파라미터에서 설정 → 각 군집에 가까운 데이터들이 각 군집에 소속 → 새로운 군집이 만들어지면 군집의 평균으로 중심점이 이동 → 거기서 다시 가까운 데이터 기준으로 군집 형성 → 더이상 중심점이 이동하지 않을 때까지 진행 (or max_iter로 횟수 제한)
  • 가정: 데이터가 여러개의 가우시안 분포를 가짐
  • 먼저 정규분포 형태 몇가지를 추출해놓고 각 데이터가 이 중 어디에 속할 것인지를 판별하는 것.
파라미터
  • n_clusters: 군집화할 개수
  • init: 초기 군집 중심점의 좌표를 설정할 방식 (보통 ‘k-means++’사용)
  • max_iter: 최대 반복 횟수. (운이 없으면 무한정 반복하기 때문!)
  • n_components: 모델의 총 개수
메소드
  • fit(): 모델을 학습시킬 때
  • fit_transform() : 데이터를 군집화하고 변환할 때
  • fit_predict(): 군집화 결과만 필요할 때..
속성
  • labels_: 각 데이터 포인트가 속한 군집 중심점 레이블/ 각 데이터가 어떤 군집에 속하는
  • cluster_centers_ : 각 군집 중심점 좌표 (시각화 가능)
 
  • 데이터 모양이 둥글때: k-means 효과적
  • 데이터 모양이 타원형일 때: gmm 효과적

 

 

KMeans

데이터 준비

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
%matplotlib inline

iris = load_iris()
irisDF = pd.DataFrame(data =iris.data, columns = iris.feature_names)
irisDF

 

KMeans

kmeans = KMeans(n_clusters=3, init='k-means++', max_iter = 300,
								random_state=0)
kmeans.fit(irisDF)

irisDF['target'] = iris.target
irisDF['cluster'] = kmeans.labels_

 

target 별 군집 수 확인

irisDF.groupby(['target','cluster'])['sepal length (cm)'].count()

>>>
target  cluster
0       1          50
1       0          48
        2           2
2       0          14
        2          36
Name: sepal length (cm), dtype: int64

target0, 1까지는 대략 잘 나눠져 있는데, target2는..애매하다?

 

PCA(4->2차원) & 시각화

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pca_transformed = pca.fit_transform(iris.data)

irisDF['pca_x'] = pca_transformed[:,0]
irisDF['pca_y'] = pca_transformed[:,1]


cluster0=irisDF[irisDF['cluster']==0]
cluster1=irisDF[irisDF['cluster']==1]
cluster2=irisDF[irisDF['cluster']==2]

# cluster 0 = 파랑
# cluster 1 = 빨강
# cluster 2 = 초록
plt.scatter(x=cluster0['pca_x'],y=cluster0['pca_y'],color='blue')
plt.scatter(x=cluster1['pca_x'],y=cluster1['pca_y'],color='red')
plt.scatter(x=cluster2['pca_x'],y=cluster2['pca_y'],color='green')

KMeans

cluster1(red)는 명확하게 다른 군집들과 잘 분리되어 있음.

cluster0(blue), cluster2(green)도 상당 수준 잘 분리되어 있지만, cluster1만큼 명확하게 분리되어 있지는 않음.

 

 

GMM

  • 가정:
    • 데이터가 여러개의 가우시안 분포를 가진 데이터 집합들이 섞여서 생성되었다.
    • 데이터는 여러개의 가우시안 분포가 섞여있는 것
    • 가우시안 분포 = 정규분포 = 평균 0, 표준편차 1
  • 먼저 정규분포 형태 몇가지를 추출해놓고 각 데이터가 이 중 어디에 속할 것인지를 판별하는 것.
  • 모수 추정을 위해 EM(expectation, maximization) 사용:
    • Expectation: 개별 데이터들이 특정 정규분포에 소속될 확률을 구하고, 가장 높은 확률을 가진 정규분포에 소속(최초시에는 임의로 특정 정규 분포에 소속)
    • Maximization: 데이터들이 특정 정규분포로 소속되면, 다시 해당 정규분포의 평균과 분산 구함. 해당 데이터가 발견될 수 있는 가능도를 최대화할 수 있도록 평균과 분산(모수)를 구함

 

데이터 준비

import warnings
warnings.filterwarnings('ignore')
from sklearn.datasets import load_iris
from sklearn.mixture import GaussianMixture
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline

iris = load_iris()

# iris 데이터프레임 만들
irisDF = pd.DataFrame(data = iris.data, columns = iris.feature_names)
irisDF['target'] = iris.target

 

GMM

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

irisDF['gmm_cluster'] = gmm_cluster_labels

 

군집 결과

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

>>>>
target  gmm_cluster
0       0              50
1       2              45
        1               5
2       1              50
Name: gmm_cluster, dtype: int64

확인결과 대체로 잘 맵핑. 이제 KMeans와 비교할 것

 

 

KMeans vs GMM

  KMeans GMM
군집 결과  target  kmeans_cluster
0       1          50
---------------------
1       0          48
         2           2
----------------------
2       0          14
         2          36
target  gmm_cluster
0       0              50
-------------------------
1       2              45
         1               5
--------------------------
2       1              50
  • Kmeans보다 GMM이 군집화 더 잘됨.
    • GMM을 보면 target이 1일 때 cluster가 1로 5개 분리된 것 빼고는 거의 잘 나뉨.
  • 이는 GMM이 더 뛰어난 알고리즘이라는 소리가 아니고, 이 iris 데이터에 GMM이 더 잘맞고 효과적이라는 뜻임.

'머신러닝 > 비지도 학습' 카테고리의 다른 글

군집 평가  (0) 2023.09.05
Meanshift vs DBSCAN  (0) 2023.09.05
군집 (clustering)  (0) 2023.09.05