머신러닝

k-means

Cozzi 2021. 11. 28. 15:39
K-means란?

가장 대표적인 clustering 모델으로, 비지도 학습이다.

주어진 데이터를 k개의 클러스터로 분류하는 작업이다. 가장 먼저 임의로 centroid를 설정하고, centroid를 수정해가면서 결론에 도달한다. (centroid가 더 이상 변화하지 않는 지점에서 멈춤)

 

k-means의 장점, 단점

<장점> : 이해와 구현이 쉽고, 효율적인 시간 복잡도를 가진다.

<단점> : 최적의 k값을 찾기 어렵고, 이상치에 민감함

 

간단한 코드
from sklearn.cluster import KMeans
Kmean = KMeans(n_clusters = 클러스터의 개수, init='centroid지정밥법')
Kmean.fit(data)

 

K-means++

일반적인 kmeans는 초기 centroid값에 따라 이상한 결과가 도출되거나, 모델이 너무 느려짐

이를 해결하기 위해, kmeans를 여러번 실행하여 가장 성능이 좋은 모델을 선택하는 방법임

- 초기 centroid 설정 시 각각의 centroid가 서로 멀어지도록 위치키는 방법

- 위의 코드에서 init 부분에 'k-means++'이라고 적으면됨

 

K개수 설정 방법

1. Elbow 방법

: SSE(sum of squares for Error ; 오차제곱합) 을 기준으로  k설정

  k에 따라 다른  SSE를 plot으로 그려, SSE의 값이 급격하게 작아지는 (elbow)를 k로 설정

  이때, k_means의 inerita를 기준으로 SSE 값 확인 가능

 

inertia = []
k_range = range(2,15)

for k in k_range :
    kmeans = KMeans(n_cluster = k)
    kmeans.fit(X)
    inertia1 = kmeans.inertia_
    
    inertia.append(inertia1)
    
inertia = np.array(inertia)

plt.plot(k_range, inertia, marker='o')
plt.show()

 

2.Silhouette

 : 군집의 결과가 얼마나 유용한지 따지는 군집 타당성 지표 중 하나로 한 군집 내의 데이터들이 다른 군집과 얼마나 비슷한 지를나타냄,,

a_i : i번쨰 개체와 같은 군집에 속한 거리들의 평균을 나타냄

b_i : i번째 개체와 다른 군집에 속한 요소들 간 거리의 평균을 군집마다 구한 뒤 그 중 가장 작은 값을 나타냄

 

이 때 , 실수엣값이 1에 가까울 수록 군집화가 잘 되어있는 것으로 판단하고, -1에 가까울 수록 군집화가 적절히 되어있지 않는 것으로 판단한다. (기준 : 0.5 ; 일반적으로 0.5이상이면 군집화가 잘 되었다고 판단)

 

from sklearn.metrics import silhouette_score

kmeans = KMeans(n_clustering=k)
kmeans.fit(X)
cluster = kmeans.predict(X)

score = silhouette_score(X, cluster)

실루엣 값은 위 코드로 확인 할 수 있고, elbow를 구한 식과 비슷하게 반복문을 돌려 가장 좋은 k값을 찾아낼 수 있다.