군집화란?
이전 내용
평균 이동(Mean Shift)
평균 이동 군집화는 데이터의 분포를 이용해 군집 중심점을 찾으며, 이를 위해 확률 밀도 함수(PDF)를 이용하여 가장 피크인 점을 군집 중심점으로 선정하며 일반적으로 주어진 모델의 확률 밀도 함수를 찾기 위해서 KDE(Kernel Density Estimation)를 이용한다.
평균 이동 군집화는 특정 데이터를 반경 내의 데이터 분포 확률 밀도가 가장 높은 곳으로 이동하기 위해 주변 데이터와의 거리 값을 KDE 함수 값으로 입력한 뒤 그 반환 값을 현재 위치에서 업데이트하면서 이동하는 방식을 취하고, 이러한 방식을 전체 데이터에 반복적으로 적용하면서 데이터의 군집 중심점을 찾아낸다.
일반적으로 평균 이동 군집화는 대역폭이 클수록 평활화된 KDE 로 인해 적은 수의 군집 중심점을 가지며 대역폭이 적을수록 많은 수의 군집 중심점을 가진다. 또한 평균 이동 군집화는 군집의 개수를 지정하지 않으며, 오직 대역폭의 크기에 따라 군집화를 수행한다.
사이킷런은 평균 이동 군집화를 위해 MeanShift 클래스를 제공하며, 가장 중요한 초기화 파라미터는 bandwidth 이며, 이는 KDE의 대역폭과 동일하다. 이는 대역폭 크기 설정이 군집화의 품질에 큰 영향을 미친다고 보면 되며, 사이킷런은 최적의 대역폭 계산을 위해 estimate_bandwidth() 함수를 제공한다.
[평균 이동 군집화 알고리즘 적용의 예]
다음은 make_blobs()의 cluster_std 를 0.7로 정한 3개 군집의 데이터에 대해 bandwidth를 0.8로 설정한 예제이다.
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import MeanShift
X, y = make_blobs(n_samples=200, n_features=2, centers=3, cluster_std=0.7, random_state=0)
meanshift = MeanShift(bandwidth=0.8)
cluster_labels = meanshift.fit_predict(X)
print('cluster labels 유형:', np.unique(cluster_labels))
군집이 6개(0~5)로 지나치게 세분화돼 군집화 되었는데, 일반적으로 bandwidth 값을 작게 할수록 군집 개수가 많아진다.
meanshift = MeanShift(bandwidth=1.0)
cluster_labels = meanshift.fit_predict(X)
print('cluster labels 유형:', np.unique(cluster_labels))
bandwidth를 1.0으로 올리면 군집이 3개로 줄어든다.
따라서 MeanShift에서는 bandwidth를 최적화 값으로 설정하는 것이 매우 중요하며, 사이킷런은 이를 위해 estimate_bandwidth() 함수를 제공한다. 해당 파라미터로 피처 데이터 세트를 입력해주면 최적화된 bandwidth 값을 반환해 준다.
from sklearn.cluster import estimate_bandwidth
bandwidth = estimate_bandwidth(X)
print('bandwidth 값:', np.round(bandwidth, 3))
estimate_bandwidth()로 측정된 bandwidth를 평균 이동값으로 적용해 make_blobs() 데이터 세트에 군집화 수행
import pandas as pd
clusterDF = pd.DataFrame(data=X, columns=['ftr1', 'ftr2'])
clusterDF['target'] = y
# 최적의 bandwidth 계산
bandwidth = estimate_bandwidth(X)
meanshift = MeanShift(bandwidth=bandwidth)
cluster_labels = meanshift.fit_predict(X)
print('cluster labels 유형:', np.unique(cluster_labels))
[군집 시각화]
평균 이동도 K-평균과 유사하게 중심을 가지고 있으므로 cluster_centers_ 속성으로 군집 중심 좌표를 표시할 수 있다.
import matplotlib.pyplot as plt
%matplotlib inline
clusterDF['meanshift_label'] = cluster_labels
centers = meanshift.cluster_centers_
unique_labels = np.unique(cluster_labels)
markers = ['o', 's', '^', 'x', '*']
for label in unique_labels:
label_cluster = clusterDF[clusterDF['meanshift_label']==label]
center_x_y = centers[label]
# 군집별로 다른 마커로 산점도 적용
plt.scatter(x=label_cluster['ftr1'], y=label_cluster['ftr2'], edgecolor='k', marker=markers[label])
# 군집별 중심 표현
plt.scatter(x=center_x_y[0], y=center_x_y[1], s=200, color='gray', alpha=0.9,
marker=markers[label])
plt.scatter(x=center_x_y[0], y=center_x_y[1], s=70, color='k', edgecolor='k', marker='$%d$' % label)
plt.show()
print(clusterDF.groupby('target')['meanshift_label'].value_counts())
▶ target 값과 군집 label 값이 1:1 로 잘 매칭되었다.
[평균 이동의 장점]
- 데이터 세트의 형태를 특정 형태로 가정하지 않음. 특정 분포도 기반의 모델로 가정 하지 않음. ▶ 유연한 군집화 가능
- 이상치의 영향력 크지 않음.
- 미리 군집의 개수를 정할 필요 없음.
[평균 이동의 단점]
- 알고리즘의 수행 시간이 오래 걸림
- bandwidth의 크기에 따른 군집화 영향도가 매우 큼.
▶ 이러한 특징으로 평균 이동 군집화 기법은 이미지나 영상 데이터에서 특정 개체를 구분하거나 움직임을 추적하는 데 뛰어난 역할을 수행하여 컴퓨터 비전 영역에서 더 많이 사용된다.
다음 내용
[출처]
파이썬 머신러닝 완벽 가이드
'[파이썬 Projects] > <파이썬 머신러닝>' 카테고리의 다른 글
[머신러닝] 군집화: DBSCAN (0) | 2024.10.27 |
---|---|
[머신러닝] 군집화: GMM (0) | 2024.10.27 |
[머신러닝] 군집화: 군집 평가 (3) | 2024.10.25 |
[머신러닝] 군집화: k-평균 (0) | 2024.10.25 |
[머신러닝] 군집화 (Clustering) (0) | 2024.10.25 |