Open njs03332 opened 2 years ago
k-평균 알고리즘 작동 방식
계산 복잡도: 샘플 개수 m, 클러스터 개수 k, 차원 개수 n에 선형적
이 알고리즘은 적절한 솔루션으로 수렴하지 못할 수 있음 (지역 최적점으로 수렴)
센트로이드 위치를 근사하게 알 수 있는 경우 (예: 또 다른 군집 알고리즘을 먼저 실행)
good_init = np.array([[-3,3],[-3,1],[-3,1],[-1,2],[0,2]])
kmeans = KMeans(n_clusters=5, init=good_init, n_init=1)
랜덤 초기화를 다르게 하여 어러 번 알고리즘을 실행하고 가장 좋은 솔루션을 선택
k-평균++ 알고리즘
from sklearn.cluster import KMeans
k = 5
kmeans = KMeans(n_clusters=k, random_state=42)
y_pred = kmeans.fit_predict(X)
kmeans.labels_
# array([4, 0, 1, ..., 2, 1, 0], dtype=int32)
kmeans.clustercenters
- 클러스터의 결정 경계를 그려보면 보로노이 다이어그램을 얻을 수 있음
- 샘플은 대부분 적절한 클러스터에 할당
<img width=400 src=https://user-images.githubusercontent.com/50584633/190105267-af2ae3c9-b0f8-4214-a949-e983af94a544.png>
- 하드 군집: 샘플을 하나의 클러스터에 할당하는 것
- 소프트 군집: 클러스터마다 샘플에 점수를 부여하는 것 ex 샘플과 센트로이드 사이의 거리, 가우시안 방사 기저 함수와 같은 유사도 점수
- transform() 메서드는 샘플과 각 센트로이드 사이의 거리 반환
```python
kmeans.transform(X_new)
# array([[2.81093633, 0.32995317, 2.9042344 , 1.49439034, 2.88633901],
# [5.80730058, 2.80290755, 5.84739223, 4.4759332 , 5.84236351],
# [1.21475352, 3.29399768, 0.29040966, 1.69136631, 1.71086031],
# [0.72581411, 3.21806371, 0.36159148, 1.54808703, 1.21567622]])
# 첫 번째 샘플이 첫 번째 센트로이드에서 2.81, 두 번째 센트로이드에서 0.33 ... 거리 만큼 떨어짐