머신러닝에는 크게 지도, 비지도, 강화학습 크게 3가지 종류가 있습니다. k-means는 직접 데이터에게 분류하는 라벨을 알려주며 학습시키는 지도학습과는 달리, 알고리즘이 직접 분류를 하는 비지도 학습의 대표적인 알고리즘인데요, 이번 포스팅에서 간단하게 원리를 소개하고자 합니다.



1. 기본 원리



-K-MEANS?

 각 문서들 속에 들어있는 데이터 분석을 통해 유사하거나 관계가 높은 항목들끼리 집합을 만들고 싶을 때 사용하는 알고리즘입니다. 알고리즘이 진행되는 순서는 아래와 같습니다.


 1. 
(처음 중심값 선택) 랜덤하게 중심값을 선택한다.
 
 2. 
(클러스터 할당) K개의 중심값과 각 개별 데이터간의
    거리를 측정한다.
    가장 가까운 클러스터에 해당 데이터를 Assign 한다.

 3. 
(새 중심값 선택) 클러스터마다 새로운 중심값을 계산한다.

 4. 
(범위 확인) 선택된 중심값이 변화가 어느정도 없다면 멈춘다.
    만약 데이터의 변화가 있다면 다시 1번부터 반복한다.




k-means의 진행순서


위와 같이 각 군집간의 평균 위치값을 잡고, 

그 위치값을 기준으로 계속해서 최적화를 해나가는 알고리즘입니다.


사진을 보면 좀 더 쉽게 이해가 되는데요,

군집의 갯수(K)와 초기 랜덤값만 지정해주면 알고리즘이 군집내의 평균점을 잡아서

가까운 지점들을 다시 군집화하고 다시 평균점을 잡고...

반복하며 최적화가 될 때까지 분류를 하는 알고리즘입니다.


초기 중심으로부터의 오차 제곱합을 최소화하는 방향으로 군집이 형성되는

일종의 Greedy 알고리즘이기 때문에 안정된 군집은 보장하지만 최적이라고는 말할 수가 없습니다.


k = squart(n/2)

적당한 k 값을 구하는 공식



k-means의 단점


적용이 상당히 쉬운반면, 적중률도 높은 편이어서 자주 쓰이는 알고리즘이지만

이런 K-Means의 큰 약점중 하나는 이상치(Outliers)가 많을 경우

적절한 군집화가 이루어지지 않는다는 점입니다.


위의 그림과 같이 이상치가 많을경우 저렇게 섬처럼

군집이 형성되는데 이상치만 포함되어있을 가능성이 크기 때문에

알고리즘을 적용하기 이전에 데이터의 모양을 먼저 파악하고 적용을 결정해야합니다.


(U자형 데이터 모양이 나타났을 때에도 분류가 잘 안된다는 단점이 있습니다.)


2. 사례



 c <- c(3,4,1,5,7,9,5,4,6,8,4,5,9,8,7,8,6,7,2,1)

 row <- c("A","B","C","D","E","F","G","H","I","J")

 col <- c("X","Y")

 data <- matrix( c, nrow= 10, ncol=2, byrow=TRUE, dimnames=list(row,col))

 data 

기본 데이터 셋을 먼저 만듭니다.


  X Y

A 3 4

B 1 5

C 7 9

D 5 4

E 6 8

F 4 5

G 9 8

H 7 8

I 6 7

J 2 1



 plot(data)


 이 데이터를 2개의 군집으로 분류하는 k-means를 돌려보는 것이 목적!



 install.packages("stats")

 library(stats)


 km <- kmeans( data , 2 )

 라이브러리는 stats이고 kmeans 함수를 씁니다. 분류대상 데이터를 넣고, k값 갯수만 넣어주면됩니다. 아주 간단합니다.


K-means clustering with 2 clusters of sizes 5, 5


Cluster means:

  X   Y

1 3 3.8

2 7 8.0


Clustering vector:

A B C D E F G H I J 

1 1 2 1 2 1 2 2 2 1 


Within cluster sum of squares by cluster:

[1] 20.8  8.0

 (between_SS / total_SS =  74.5 %)


Available components:


[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"   

[7] "size"         "iter"         "ifault"      

맨 아래의 Available components를 통해 값들에 접근이 가능합니다.



 plot( round(km$center), col = km$center, pch = 22, bg = "dark blue", 

       xlim = range(0:10), ylim = range(0:10) )

  분류가 된 k개의 군집의 중앙값을 출력합니다.

 plot( round(km$center), col = km$center, pch = 22, bg = "dark blue", 

      xlim = range(0:10), ylim = range(0:10) )

 par(new = T) 

 plot(data, col = km$cluster+1  ,xlim = range(0:10), ylim = range(0:10))


 원래 데이터를 위의 그래프에 합쳐서 출력하면 구분된 군집을 시각화할 수 있습니다.




이렇게 나오면 끝!

동그라미 하나를 그려주고 싶은 욕심이 드네요...


*아이티윌 유연수 선생님의 강의를 요약한 포스팅입니다.








반응형
Posted by JoeSung
,