군집화(clustering)
비슷한 샘플을 구별해 하나의 클러스터(= 군집) 또는 비슷한 샘플의 그룹으로 할당하는 작업

군집화 활용 영역


몇 번의 반복으로 데이터셋을 빠르고 효율적으로 클러스터로 묶을 수 있는 간단한 알고리즘
각 클러스터의 중심(= centroid)을 찾고 가장 가까운 클러스터에 샘플을 할당
→ 결정 경계를 보로노이 다이어그램을 통해 확인 가능

알고리즘이 찾을 클러스터의 개수(k)를 지정해 주어야 함
labels_ 인스턴스를 통해 알고리즘이 샘플에 할당한 클러스터를 확인 가능
k-means 알고리즘은 클러스터의 크기가 많이 다른 경우 잘 작동하지 않음
하드 군집 vs 소프트 군집
transform() : 샘플과 각 센트로이드 사이의 거리 반환알고리즘 작동 원리
센트로이드가 주어지는 경우 이를 활용하여 클러스터 할당
센트로이드가 주어지지 x

처음: 랜덤 설정
이후 샘플에 레이블을 할당하고 센트로이드를 업데이트하고, 샘플에 레이블을 할당하고 센트로이드를 업데이트
→ 센트로이드에 변화가 없을 때까지 반복
kmeans 알고리즘은 대부분 수렴이 보장되지만, 센트로이드 초기화에 따라 최적 솔루션으로 수렴하지 못할 수도 있음(→ 지역 최적점으로 수렴하는 경우)
센트로이드 초기화
n_init 매개변수로 조절최선의 솔루션
평가 지표) inertia(= 각 샘플과 가장 가까운 센트로이드 사이의 평균 제곱 거리)
→ 확인: kmeans.inertia_
KMeans 클래스는 알고리즘을 n_init번 실행 후 이너셔가 가장 낮은 모델을 반환
kmeans.score(): 이너셔의 음숫값 반환
k-means++ 초기화 알고리즘

k-means 속도 개선과 미니배치 k-means
불필요한 거리 계산을 많이 피하기 위해 삼각 부등식을 활용
⇒ 두 점 사이의 직선은 항상 가장 짧은 거리
전체 데이터셋을 사용해 반복하는 것이 아닌 각 반복마다 미니배치를 사용해 센트로이드를 조금씩 이동 가능
sklearn.MiniBatchKMeans 클래스를 통해 구현 가능MiniBatchKMeans.partial_fit() 메서드를 통해 한 번에 하나의 미니배치를 전달 가능미니배치 k-means 알고리즘은 일반 k-means 알고리즘보다 속도는 빠르지만 inertia는 일반적으로 조금 더 나쁨

최적 클러스터 개수 찾기
Elbow Method
→ inertia 감소 비율이 급격히 감소하는 지점을 최적 k로 선택

실루엣 점수
모든 샘플에 대한 실루엣 계수의 평균
-1에서 1 사이의 값을 가짐
실루엣 점수를 계산하기 위해 silhouette_score() 함수를 사용
실루엣 다이어그램

모든 샘플의 실루엣 계수를 할당된 클러스터와 계숫값으로 정렬하여 시각화 한 도표
높이: 클러스터가 포함하고 있는 샘플의 개수
너비: 해당 클래스에 포함된 샘플의 정렬된 실루엣 계수
→ 넓을수록 good
수직선: 각 클러스터 개수에 해당하는 실루엣 점수