: 중심을 군집의 중심(데이터가 모여 있는 밀도가 가장 높은 곳)으로 지속적으로 움직이면서 군집화 수행.
주변 데이터와의 거리 값을 KDE 함수 값으로 입력한 뒤 그 반환 값을 현재 위치에서 업데이트하면서 이동
: 함수를 통해 어떤 변수의 확률 밀도 함수를 추정하는 대표적인 방법
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)
# bandwidth 최적화 값 찾기
from sklearn.cluster import estimate_bandwidth
best_bandwidth = estimate_bandwidth(X)
print('bandwidth 값:', round(bandwidth,3))
# 평균 이동을 통한 군집화
meanshift = MeanShift(bandwidth=best_bandwidth)
cluster_labels = meanshift.fit_predict(X)
print('cluster labels 유형:', np.unique(cluster_labels))
# 레이블 값 비교
print(clusterDF.groupby('target')['meanshift_label'].value_counts())
=> 분석 업무 기반의 데이터 세트보다는 컴퓨터 비전 영역에서 많이 사용. 이미지나 영상 데이터에서 특정 개체를 구분하거나 움직임을 추적하는 데 뛰어난 역할.
GMM 군집화: 군집화를 적용하고자 하는 데이터가 여러 개의 가우시안 분포(정규분포)를 가진 데이터 집합들이 섞여서 생성된 것이라는 가정 하에 군집화를 수행하는 방식
데이터 세트를 구성하는 여러 개의 정규 분포 곡선을 추출하고 개별 데이터가 이 중 어느 정규 분포에 속하는지 결정함 => 모수 추정
from sklearn.mixture import GaussianMixture
# gmm으로 군집화
gmm = GaussianMixture(n_components=3, random_state=0).fit(iris.data)
gmm_cluster_labels = gmm.predict(iris.data)
# 클러스터링 결과 저장
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)
# 클러스터 결과를 담은 DataFrame과 사이킷런의 Cluster 객체등을 인자로 받아 클러스터링 결과를 시각화하는 함수
def visualize_cluster_plot(clusterobj, dataframe, label_name, iscenter=True):
if iscenter :
centers = clusterobj.cluster_centers_
# 레이블 값 및 군집 표시 기호 설정
unique_labels = np.unique(dataframe[label_name].values)
markers=['o', 's', '^', 'x', '*']
isNoise=False
for label in unique_labels:
label_cluster = dataframe[dataframe[label_name]==label]
if label == -1:
cluster_legend = 'Noise'
isNoise=True
else :
cluster_legend = 'Cluster '+str(label)
plt.scatter(x=label_cluster['ftr1'], y=label_cluster['ftr2'], s=70,\
edgecolor='k', marker=markers[label], label=cluster_legend)
if iscenter:
center_x_y = centers[label]
plt.scatter(x=center_x_y[0], y=center_x_y[1], s=250, color='white',
alpha=0.9, edgecolor='k', marker=markers[label])
plt.scatter(x=center_x_y[0], y=center_x_y[1], s=70, color='k',\
edgecolor='k', marker='$%d$' % label)
if isNoise:
legend_loc='upper center'
else: legend_loc='upper right'
plt.legend(loc=legend_loc)
plt.show()
: 특정 공간 내에 데이터 밀도 차이에 기반한 알고리즘으로 군집화 수행
최소 데이터 세트를 5개로 가정
Step 1: P1을 기준으로 이웃 포인트가 6개 이므로 P1은 핵심 포인트
Step 2: P2를 기준으로 이웃 포인트 5개이므로 P2는 핵심 포인트
Step 3: P1의 이웃 포인트 P2가 핵심 포인트이므로 직접 접근 가능
Step 4: P1에서 직접 접근이 가능한 P2를 서로 연결하여 군집화 구성
Step 5: 위 과정을 반복하여 점차적으로 군집 영역 확장
from sklearn.cluster import DBSCAN
# 주변 영역 반경 = 0.6, 최소 데이터 개수 = 8
dbscan = DBSCAN(eps=0.6, min_samples=8, metric='euclidean')
dbscan_labels = dbscan.fit_predict(iris.data)
# 군집화된 레이블 값 저장
irisDF['dbscan_cluster'] = dbscan_labels
irisDF['target'] = iris.target
# 예측 비교
iris_result = irisDF.groupby(['target'])['dbscan_cluster'].value_counts()
print(iris_result)
from sklearn.datasets import make_circles
X, y = make_circles(n_samples=1000, shuffle=True, noise=0.05, random_state=0, factor=0.5)
clusterDF = pd.DataFrame(data=X, columns=['ftr1', 'ftr2'])
clusterDF['target'] = y
visualize_cluster_plot(None, clusterDF, 'target', iscenter=False)
데이터 형태
(좌) KMeans / (우) GaussianMixture
DBSCAN
DBSCAN은 정확히 군집화 됨
: 다양한 기준으로 고객을 분류하는 기법
@