1. K-평균 (K-Means)
가장 널리 사용되는 군집화 알고리즘 중 하나로, 사전에 지정한 K개의 클러스터 중심을 기반으로 데이터를 군집화합니다. 각 데이터 포인트는 가장 가까운 중심(centroid)에 할당되며, 중심이 점차적으로 최적의 위치로 이동하면서 클러스터가 형성됩니다.
- 동작 과정:
- 초기 K개의 중심을 무작위로 설정.
- 각 데이터 포인트를 가장 가까운 중심에 할당하여 K개의 군집을 형성.
- 각 군집의 평균으로 중심을 업데이트.
- 중심이 수렴할 때까지(변하지 않을 때까지) 반복.
- 장점과 단점:
- 장점: 계산 속도가 빠르고, 대규모 데이터에 적합.
- 단점: 초기 중심값에 민감하며, 구형 클러스터만 잘 분류 가능.
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
# 데이터 생성
X = np.random.rand(100, 2) # 100개의 2차원 데이터
# K-평균 모델 학습
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=300, n_init=10, random_state=42)
kmeans.fit(X)
# 클러스터 레이블 및 중심점 출력
print("클러스터 레이블:", kmeans.labels_)
print("클러스터 중심:", kmeans.cluster_centers_)
# 시각화
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red', label='Centroids')
plt.legend()
plt.show()
수정 가능한 주요 파라미터
- n_clusters:
클러스터 수를 지정합니다.
데이터의 분포에 맞게 조정하며, 엘보우 방법이나 실루엣 계수를 통해 최적의 K를 찾을 수 있습니다. - init:
초기 중심값 설정 방법으로, 'k-means++'가 기본값이며, 더 빠르게 수렴할 수 있도록 도와줍니다. - max_iter:
최대 반복 횟수로, 수렴하지 않을 때 반복을 제한할 수 있습니다. - n_init:
초기 중심값 설정을 여러 번 반복하여 가장 좋은 결과를 선택합니다. 클러스터링의 안정성을 높여줍니다. - random_state:
난수 시드를 설정하여 결과의 재현성을 보장합니다.
데이터 형식:
- 구형 또는 원형 클러스터에 적합합니다.
- 비선형 분포가 아닌 데이터에 잘 작동하며, 구형의 군집이 다수 포함된 데이터에 최적입니다.
- 연속형 변수로 구성된 데이터에서 효과적입니다.
적합한 예시:
- 고객의 나이와 소득과 같이, 클러스터가 구형에 가까운 경우.
- 복잡하지 않고 뚜렷한 구형 분포를 가진 데이터.
주의점:
- 클러스터의 개수를 사전에 설정해야 하며, 초기화에 민감할 수 있습니다.
- 비구형 클러스터가 있는 경우에는 성능이 떨어질 수 있습니다.
2. 계층적 군집화 (Hierarchical Clustering)
계층적 군집화는 데이터 간의 계층적 구조를 기반으로 클러스터를 형성합니다. 이 방법은 특히 군집의 수를 사전에 알 수 없거나 데이터의 계층 구조를 파악하고자 할 때 유용합니다.
- 동작 과정:
- 병합(합병) 방식: 각 데이터 포인트를 개별 클러스터로 시작하고, 유사한 클러스터들을 순차적으로 병합합니다.
- 분할 방식: 전체 데이터 집합을 하나의 클러스터로 시작하여 순차적으로 클러스터를 분할합니다.
- 장점과 단점:
- 장점: 클러스터 수를 사전에 설정할 필요가 없으며, 덴드로그램을 통해 계층 구조를 시각화할 수 있습니다.
- 단점: 계산량이 많아 데이터가 많을 때는 사용이 어려울 수 있습니다.
- 덴드로그램:
- 데이터의 계층 구조를 시각화하여 최적의 클러스터 개수를 판단할 수 있는 도구입니다.
from sklearn.cluster import AgglomerativeClustering
import scipy.cluster.hierarchy as sch
# 데이터 생성
X = np.random.rand(100, 2)
# 계층적 군집화 모델 생성 및 학습
model = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward')
model.fit(X)
# 덴드로그램 시각화
plt.figure(figsize=(8, 5))
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))
plt.title("Dendrogram")
plt.xlabel("Data points")
plt.ylabel("Euclidean distances")
plt.show()
수정 가능한 주요 파라미터
- n_clusters:
최종 군집 수를 설정합니다. 덴드로그램을 통해 적절한 클러스터 수를 시각적으로 판단할 수 있습니다. - affinity:
데이터 간의 유사성을 측정하는 방식으로, 'euclidean', 'manhattan', 'cosine' 등이 있습니다. - linkage:
클러스터 간의 거리 계산 방법을 설정합니다.
'ward'는 군집 내 분산을 최소화하며, 'single', 'complete', 'average'는 각각 단일, 완전, 평균 연결법을 사용합니다.
데이터 형식:
- 작은 규모의 데이터셋에 적합하며, 계층적 구조를 반영한 클러스터링이 필요할 때 효과적입니다.
- 구형이나 비구형 클러스터에도 적용 가능하지만, 비구형 클러스터는 워드 연결법이 효과적입니다.
- 데이터 포인트의 개수가 많지 않은 데이터에서 잘 작동합니다.
적합한 예시:
- 고객 세분화에서 고객을 소규모 그룹으로 나누고 계층적 관계를 시각화하고자 할 때.
- 유사한 단어들끼리 그룹화하여 텍스트 데이터의 유사성 분석에 활용.
주의점:
- 데이터 포인트가 많으면 계산량이 커지므로, 대규모 데이터에는 적합하지 않습니다.
- 덴드로그램을 해석하기 어려울 수 있습니다.
3. DBSCAN (Density-Based Spatial Clustering of Applications with Noise)
DBSCAN은 밀도 기반 군집화 알고리즘으로, 밀도가 높은 데이터 포인트를 클러스터로 묶고,
밀도가 낮은 데이터는 노이즈로 분류합니다.
DBSCAN은 비구형 클러스터나 잡음 데이터를 효과적으로 처리할 수 있습니다.
- 동작 과정:
- 각 데이터 포인트에 대해 주어진 반경(ε) 내에 최소 포인트 수(minPts)가 존재하면 클러스터로 지정.
- 클러스터 내에서 계속해서 반경 내의 포인트를 연결해 나가며 군집을 확장.
- 장점과 단점:
- 장점: 비구형 데이터와 노이즈가 많은 데이터에 효과적입니다.
- 단점: 데이터 밀도가 균일하지 않으면 클러스터링 성능이 떨어질 수 있습니다.
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
import numpy as np
# 데이터 생성
X = np.random.rand(100, 2)
# DBSCAN 모델 학습
dbscan = DBSCAN(eps=0.1, min_samples=5, metric='euclidean')
dbscan.fit(X)
# 클러스터 레이블 출력
print("클러스터 레이블:", dbscan.labels_)
# 시각화
plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_, cmap='viridis')
plt.title("DBSCAN Clustering")
plt.show()
수정 가능한 주요 파라미터
- eps:
포인트가 클러스터에 속하기 위한 최대 거리입니다.
작을수록 더 작은 클러스터가 형성되고 노이즈가 많아질 수 있습니다. - min_samples:
클러스터를 형성하기 위한 최소 데이터 수입니다. 값이 클수록 노이즈 데이터가 증가할 수 있습니다. - metric:
거리 계산 방식으로, 'euclidean', 'manhattan', 'cosine' 등을 사용할 수 있습니다.
데이터 형식:
- 비구형 클러스터와 노이즈가 많이 포함된 데이터에 적합합니다.
- 밀도 차이가 있는 데이터에서 클러스터링 성능이 뛰어나며, 다양한 모양의 클러스터를 효과적으로 찾습니다.
- 데이터 밀도가 일정하지 않거나 잡음이 많은 데이터에 잘 작동합니다.
적합한 예시:
- 위치 데이터(GPS 좌표)와 같이 클러스터가 불규칙한 모양을 가질 때.
- 소셜 네트워크 데이터, 공간 데이터 등 비구형 클러스터가 많이 존재하는 데이터.
주의점:
- 데이터 밀도가 일정하지 않을 경우 성능이 떨어질 수 있습니다.
- 파라미터 eps와 min_samples 설정에 민감하며, 파라미터 튜닝이 중요합니다.
4. Mean-Shift
Mean-Shift는 각 데이터 포인트에서 시작해 데이터의 밀도가 가장 높은 방향으로 이동하여 클러스터를 형성합니다. Mean-Shift는 최적의 군집 개수를 자동으로 결정할 수 있어 사전 설정이 필요하지 않습니다.
- 동작 과정:
- 데이터 포인트에서 시작하여 밀도가 높은 방향으로 이동.
- 이동이 멈출 때까지 반복하여 **모드(mode, 밀도가 높은 지역)**를 형성.
- 장점과 단점:
- 장점: 사전에 클러스터 개수를 지정할 필요가 없습니다.
- 단점: 계산 비용이 높아 대규모 데이터셋에 적용하기 어렵습니다.
from sklearn.cluster import MeanShift, estimate_bandwidth
import numpy as np
import matplotlib.pyplot as plt
# 예제 데이터 생성
X = np.random.rand(100, 2)
# 대역폭(bandwidth) 추정 및 Mean-Shift 모델 생성
bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=50)
mean_shift = MeanShift(bandwidth=bandwidth)
mean_shift.fit(X)
# 클러스터 레이블과 중심점 출력
labels = mean_shift.labels_
cluster_centers = mean_shift.cluster_centers_
print("클러스터 레이블:", labels)
print("클러스터 중심점:", cluster_centers)
# 시각화
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], s=300, c='red', marker='X', label='Centroids')
plt.legend()
plt.title("Mean-Shift Clustering")
plt.show()
수정 가능한 주요 파라미터
- bandwidth:
데이터 포인트가 이동할 반경을 설정합니다.
estimate_bandwidth 함수를 통해 최적의 대역폭을 자동으로 추정할 수 있으며,
값을 변경하면 클러스터 크기와 개수에 영향을 미칩니다. - bin_seeding:
True로 설정하면 속도 향상을 위해 초기 포인트를 격자 형태로 설정합니다. - max_iter:
최적의 중심점으로 이동할 때의 최대 반복 횟수로, 모델의 학습 속도를 조정할 수 있습니다.
데이터 형식:
- 밀집된 영역이 있는 데이터에 적합하며, 데이터 분포에 따라 자동으로 군집 수를 결정합니다.
- 데이터가 비구형 클러스터를 가지거나, 클러스터 수를 사전에 알 수 없는 경우 유용합니다.
- 노이즈가 적은 데이터에서 잘 작동하며, 데이터의 밀집도를 바탕으로 군집을 형성할 수 있습니다.
적합한 예시:
- 이미지 분석에서 색상이나 픽셀 밀도를 기반으로 객체를 군집화할 때.
- 데이터 내 밀집된 군집의 위치를 파악해야 하는 경우, 예를 들어 병원 환자 상태 분류.
주의점:
- 대규모 데이터에는 계산량이 많아 비효율적일 수 있습니다.
- bandwidth 설정에 따라 결과가 크게 달라지므로, 적절한 설정이 중요합니다.
반응형
'데이터분석' 카테고리의 다른 글
유데미(Udemy) 러닝 크루 【한글자막】 머신러닝의 모든 것 with AI, Python & R + ChatGPT Prize [2024] 수강완료 후기 (4) | 2024.12.23 |
---|---|
연관분석 (2) | 2024.11.10 |
앙상블 기법 (1) | 2024.11.10 |
분류분석 (0) | 2024.11.09 |
오분류 추정 및 확인 (0) | 2024.11.09 |