Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

My blog

[ML_week5_chap7] 군집화 본문

ML

[ML_week5_chap7] 군집화

gayoung 2026. 2. 17. 04:22

01  K-평균 알고리즘 이해 

K평균 알고리즘 : 데이터들을 k개의 군집으로 나누는 군집화 알고리즘으로 각 군집은 중심점을 기준으로 구성

  1. 군집 수 k 지정, 임의로 중심점 초기화
  2. 각 데이터 → 가장 가까운 중심점에 할당 (Hard assignment)
  3. 각 군집 중심점 → 소속 데이터 평균 위치로 이동
  4. 소속 변경 없을 때까지 반복
  • 단순하고 빠름
  • 중심점 기준 → 원형 군집에 최적
  • 타원형이나 겹치는 군집에는 잘 안됨

- 단점 

: 거리 기반 알고리즘으로 속성의 개수가 많으면 군집화 정확도가 떨어짐 (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