My blog
[ML_week5_chap7] 군집화 본문
01 K-평균 알고리즘 이해
K평균 알고리즘 : 데이터들을 k개의 군집으로 나누는 군집화 알고리즘으로 각 군집은 중심점을 기준으로 구성
- 군집 수 k 지정, 임의로 중심점 초기화
- 각 데이터 → 가장 가까운 중심점에 할당 (Hard assignment)
- 각 군집 중심점 → 소속 데이터 평균 위치로 이동
- 소속 변경 없을 때까지 반복
- 단순하고 빠름
- 중심점 기준 → 원형 군집에 최적
- 타원형이나 겹치는 군집에는 잘 안됨
- 단점
: 거리 기반 알고리즘으로 속성의 개수가 많으면 군집화 정확도가 떨어짐 (pca로 차원축소 적용해야함)
: 반복많으면 수행시간 느림
kmeans = KMeans(n_clusters=3,init='k-means++',max_iter=300,random_state=0)
kmeans.fit(irisDF) # irisDf 데이터에 대한 군집화 수행 결과가 Kmeans 객체 변수로 반환
print(kmeans.labels_) # 각 데이터가 어느 중심에 속하는지 출력
군집화 알고리즘 테스트를 위한 데이터 생성
make_blobs
X,y = make_blobs(n_samples=200,n_features=2,centers=3,random_state=0)
#200개 데이터,피처개수 2개, 3개의 군집화 덩어리 X , 3개 군집화 값 y
#print(X,y) : (200,2) (200,)
# KMeans 객체를 이용해 x 데이터를 K-Means 클러스터링 수행
kmeans = KMeans(n_clusters=3, init='k-means-I+',max_iter=200,random_state=0)
cluster_labels= kmeans.fit_predict(X)
clusterDF['kmeans_label'] = cluster_labels
02 군집 평가
비지도학습의 특성상 정확한 성능 평가는 어렵지만 군집화의 성능을 평가하는 대표적인 방법은 실루엣 분석이다
실루엣 분석 : 자기 군집에 얼마나 잘 속해있고 다른 군집 간의 거리가 얼마나 분리가 잘 됐는지
- 실루엣 계수: 얼마나 가깝고 먼지 나타내는 지표 , -1~ 1, 1 : 잘 떨어져 있다는 뜻 , -1 : 다른 군집에 데이터 포인트가 할당
- a(i) = 같은 군집 내 평균 거리
- b(i) = 가장 가까운 다른 군집까지 평균 거리
- a가 작을 수록 좋음 (자기 군집끼리 가까움) b가 클 수록 좋음
- 개별군집 실루엣 계수의 평균값이 전체 실루엣 계수의 평균값을 크게 벗어나지 않아야 좋은 군집화
- 실루엣 계수 낮음 -> 데이터끼리 덜 뭉쳤거나 다른 군집과 가까움


사이킷런 실루엣 분석 관련 메서드
- silhouette_samples(X, labels, metric='euclidean ', """kwds) : 각 데이터 포인트의 실루엣 계수 반환 (,) 1차원 배열
- silhouette_score(X. labels, metric='euclidean', sample_size=None, **kwds): 전체 데이터의 실루엣 계수 값의 평균값 반환 (일반적으로 이 값 높으면 군집화 잘됐지만 무조건은 아니다 )
# K-Means 군집화 수행
# KMeans 객체 생성
# - n_clusters: 군집 개수 - init: 중심점 초기화 방법('k-means++' 추천)
# - max_iter: 최대 반복 횟수 - random_state: 결과 재현용
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=300, random_state=0)
# 데이터 학습
kmeans.fit(irisDF)
# 각 데이터의 군집 번호를 컬럼으로 추가
irisDF['cluster'] = kmeans.labels_
# 각 데이터의 실루엣 계수 계산
# silhouette_samples: 각 데이터가 속한 군집의 적합도 측정 / 값 범위: -1 ~ 1
# : 군집 내 잘 속함 / 0: 경계 / -1: 잘못 배정
score_samples = silhouette_samples(iris.data, irisDF['cluster'])
irisDF['silhouette_coeff'] = score_samples
# 4️ 전체 평균 실루엣 점수 계산 silhouette_score:
# - 전체 데이터 평균 실루엣 계수 / 값이 클수록 군집이 잘 형성됨
average_score = silhouette_score(iris.data, irisDF['cluster'])
- visualize_silhouette([2,3,4,5],X_features) : 군집개수 리스트 , X_featrues 넣으면
군집 개수를 변화시키면서 K-평균 균집을 수행했을 때 개별 군집별 평균 실루엣 계수값을 시각화
03 평균 이동
k-평균과 유사하게 중심을 군집의 중심으로 지속적으로 움직인다
하지만 k-평균은 (소속 데이터의 평균 거리 중심으로 이동) 하는데 반해 , 평균 이동은 밀도가 높은 곳으로 이동시킨다
-> KDE(커널함수를 통해 어떤 변수의 확률 밀도 함수PDF를 추정하는 방법==데이터 분포 추정) 사용
KDE (Kernel Density Estimation)란?
- 관측된 데이터 각 점에 커널 함수를 적용하고, 이를 모두 합산하여 확률 밀도 함수(PDF)를 추정하는 방법
- 확률 밀도 함수(PDF)
- 변수의 값이 특정 값 근처에 나타날 확률을 연속 함수로 나타낸 것
- 정규분포, 감마분포, t-분포 등으로 표현 가능

- 대역폭 h = KDE 곡선을 얼마나 부드럽게 만들지 결정
- 작은 h → 좁고 뾰족한 커널 → 데이터 변동성을 과도하게 반영 → 과적합(overfitting)
- 큰 h → 넓고 평활한 커널 → 군집 구조를 단순화 → 과소적합(underfitting)
- h가 크면 많은 군집 , 작으면 적은 군집
- 군집 개수를 사전에 지정하지 않아도됨
# 1.MeanShift 군집화
ms = MeanShift(bandwidth=0.8)
cluster_labels = ms.fit_predict(X)
print(np.unique(cluster_labels)) -> [0 1 2 3 4 5 ] 세분화 분류
# bandwidth 값을 작게할 수록 군집 개수가 많아짐 - 최적의 bandwidth를 찾아야함
# 2. 최적 대역폭 계산
bandwidth = estimate_bandwidth(X)
- 장점 : 데이터 세트 , 특정 분포도 기반의 모델로 가정하지 않아서 유연한 군집화 , 이상치 영향 크지 X , 미리 군집개수 정하지X
- 단점 : 수행시간 오래걸림 , bandwidth의 크기에 따른 군집화 영향도가 큼
04 GMM(Gaussian Mixture Model)
- 가정: 데이터가 여러 개의 가우시안 분포가 섞여 생성되었다고 봄
- 목적: 섞인 데이터에서 각각의 가우시안 분포를 추정하고, 이를 통해 군집화 수행
K-Means는 Hard assignment → 이 군집에 속한다
GMM은 Soft assignment → 이 군집에 속할 확률이 70% 정도
모수 추정 : 개별 정규 분포의 평균과 분산 , 각 데이터 어떤 정규분포에 해당하는지 확률 추정
<EM 알고리즘 사용>
- E-step: 현재 분포 파라미터로 각 데이터의 군집 확률 계산
- 현재 μ, σ², π를 바탕으로 각 데이터가 어떤 가우시안에 속할 확률 계산
- 예: 데이터 x₁ → Gaussian A에 70%, B에 20%, C에 10%
- M-step: 확률을 기반으로 평균 μ, 공분산 Σ 등 파라미터 업데이트
- E-Step에서 계산한 확률을 바탕으로 각 분포의 평균 μ, 분산 σ², 가중치 π 재계산
- → 분포 파라미터가 데이터에 더 맞도록 조정
- 반복 → e,b스텝하다가 변화가 거의 없으면 수렴 : 군집 결정
# n_components : k평균의 n_clustes와 같이 군집의 개수를 정하는 역할
# 1. GMM 객체 생성 및 학습
gmm = GaussianMixture(n_components=3, random_state=8).fit(iris.data)
# 2. 학습된 GMM으로 각 데이터의 군집 레이블 예측
gmm_cluster_labels = gmm.predict(iris.data)
GMM vs K-평균
| k-means | gmm | |
| 군집 형태 | 원형 | 타원형가능 |
| 군집 할당 | Hard assignment (1점 → 1군집) | Soft assignment (각 점이 여러 군집에 속할 확률) |
| 데이터 분포 가정 | 없음 | Gaussian 혼합 |
| 장점 | 빠르고 단순 | 유연하고 확률 기반 |
| 중심점 기준 거리를 계산 | 중심 , 분산 , 공분산 고려해서 타원형 군집 잘 함 |
05 DBSCAN
- 밀도 기반 군집화 알고리즘: 밀도 기준 충족하는 핵심포인트를 연결하면 군집화 구성
- 데이터가 서로 가까운 점들기리 모여 있는 영역을 군집을 판단
-복잡한 형태(원형,도넛형,구멍) 도 군집화 가능
핵심 파라미터
1. eps (입실론) : 개별 데이터를 중심으로 하는 반경. 이 반경 안에 있는 점들을 이웃으로 판단
2. min_samples : 핵심 포인트가 되기 위해 입실론 반경 안에 포함돼야 하는 최소 점 개수 (자기 자신 포함)
- eps 클수록 노이즈 작음 , min_samples 클수록 노이즈 큼
핵심포인트 : 주변 영역 내에 최소 데이터 개수 이상
이웃포인트 : 타 데이터
경계포인트 : 핵심이 안되지만 이웃포인트에 핵심포인트가 있음 (군집 외곽 형성)
잡음 포인트

#eps 반경 안을 이웃으로 ,
dbscan = DBSCAN(eps=0.6, min_samples=8, metric='euclidean')
dbscan_labels = dbscan.fit_predict(iris.data)
'ML' 카테고리의 다른 글
| [ML_week4_chap4] 분류 (0) | 2026.02.10 |
|---|---|
| [ML_week4_chap3] 평가 (0) | 2026.02.10 |
| [ML_week3_chap5] 회귀 (0) | 2026.02.03 |
| [ML_week2_chap6] 차원축소 (0) | 2026.01.27 |
| [ML_week2_chap2] 사이킷런 (0) | 2026.01.24 |