【기계 학습】K-means를 공부해 본다

K-means 클러스터링이란?



K-means는 클러스터링에 사용되는 교사 없는 학습 방법입니다.
K개의 클러스터로 분류하고 평균값을 중심으로 하기 때문에 K-means라고 합니다.

K-Means 알고리즘



1) 임의로 1~k개의 데이터 포인트를 클러스터의 무게 중심 $\mu_i$로 선택한다.
2) 나머지 모든 데이터 포인트를 1에서 선택한 가장 가까운 클러스터에 할당합니다.
3) 각 클러스터에서 평균값을 계산하고 $\mu_i$를 업데이트합니다.
4) 2~3을 무게 중심의 변경이 없어질 때까지 반복한다.



K의 결정방법(Elbow Method)



K-means에서는 클러스터 수 K를 지정해야합니다. K가 너무 많으면 과학을 배우거나 반대로 너무 적으면 본래 나누어야 할 데이터가 같은 클러스터에 들어 버릴 가능성도 있습니다. 그래서 최상의 K를 찾는 방법은 Elbow method입니다.

Elbow method 에서는 y축에 손실을 취해, x축에 클러스터수 K 를 취하는 아래와 같은 그래프를 그립니다. 이때 팔꿈치와 같이 구부러진 부분에 걸리는 K를 최적의 클러스터 수로 하므로, Elbow Method라고 불립니다.



scikit learn 에 K-Means



파라메터




매개변수
개요

기본


n_clusters
클러스터 수
int
8

init
초기 무게 중심 설정
'k-means', 'random', 데이터 포인트
'K-means++'(빨리 수렴하도록 자동으로 선택해 준다)

n_init
몇 번 무게 중심을 바꾸는가?
int
10

max_iter
반복 횟수
int
10

tol
수렴 허용치
float
1e-4

precompute_distance
거리를 행렬 또는 개별적으로 계산할지
'auto', bool
'자동'

random_state
무게 중심의 초기 값의 랜덤 방법
int, RandomState instance
None

n_jobs
각 런타임에 동시 처리 수
int
None


파이썬 실행 예



Elbow Method



from sklearn import datasets
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans

iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target

from sklearn.cluster import KMeans
wcss = []

for i in range(1, 11):
    kmeans = KMeans(n_clusters = i, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)


plt.plot(range(1, 11), wcss)
plt.title('The elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS') 
plt.show()




정확히 3정도가 팔꿈치에 해당하기 때문에 K=3으로 학습시킨다.

Predict



kmeans = KMeans(n_clusters = 3, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)
y_kmeans = kmeans.fit_predict(X)

plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s = 100, c = 'red', label = 'Iris-setosa')
plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s = 100, c = 'blue', label = 'Iris-versicolour')
plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s = 100, c = 'green', label = 'Iris-virginica')

#Plotting the centroids of the clusters
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:,1], s = 100, c = 'yellow', label = 'Centroids')

plt.legend()



K-means의 장점과 단점



장점


  • 간단.
  • 시각화하기 쉽다.

  • 단점


  • 스케일에 의존하기 쉽다.
  • 불균일하고 광범위하게 흩어져 있는 데이터에는 적합하지 않다.
  • 좋은 웹페이지 즐겨찾기