K-평균(K-Means)에 대한 이론이 필요하신 분들은 아래 링크를 참조해주시기 바랍니다.
[인공지능][개념] K-평균(K-means) 알고리즘과 군집화(Clustering) + 이너셔(Inertia) 이해하기 : https://itstory1592.tistory.com/17
[인공지능][실습] K-평균(K-Means) 알고리즘으로 과일(fruits) 사진을 분류해보고 엘보우(Elbow) 방법을 통해 최적의 k값을 찾아보자 : https://itstory1592.tistory.com/18
이번 포스팅에서는 지난 시간에 이어 K-Means++ 알고리즘에 대해 알아보도록 하자!
K-Means++ 알고리즘은 기존 K-Means 알고리즘을 개선한 분류 알고리즘이다.
그런데 왜 K-Means++ 알고리즘이 생겨나게 된걸까??
기존에 사용하던 K-Means 알고리즘은 다음과 같은 문제점이 있다.
1. 클러스터 중심(센트로이드)을 초기에 랜덤하게 위치시키기 때문에, 매번 결과가 달라질 수도 있다.
2. 한 번에 k개의 센트로이드를 랜덤하게 생성하기 때문에, 각 센트로이드 사이의 거리가 짧으면 분류가 제대로 이루어지지 않을 수 있다.
위와 같이, K-Means 알고리즘은 랜덤하게 센트로이드를 생성한다는 이유로 쉽고 빠르게 연산을 할 수 있지만,
랜덤하다는 이유로 결과 값이 매번 달라지며, 결과가 좋지 않을 수도 있다는 것이다.
이런 단점을 개선하기 위해 새롭게 구상된 방법이 바로 K-Means++ 알고리즘이다.
K-Means++
K-Means++ 알고리즘의 원리는 아래의 과정과 같다.
해당 과정은 총 4가지로 정리할 수 있다.
1. 센트로이드를 한 번에 k개 모두 생성하는 것이 아니라, 데이터 포인터 중에서 무작위로 '1개'를 선택하여, 이 데이터를 첫 번째 센트로이드로 지정한다.
2. 나머지 데이터 포인터들과 센트로이드 사이의 거리를 계산한다.
3. 그다음 생성할 센트로이드들의 위치는, 데이터 포인터들과 2번 과정에서 계산한 센트로이드 사이의 거리비례 확률에 따라 선정된다.
(데이터 사이의 거리에서 최대한 먼 곳에 다음 센트로이드를 생성한다는 뜻이다.)
4. 위 과정을 k번 반복하여 총 k개의 센트로이드를 생성한다.
위 내용을 정리해보자면, 한 번에 k개의 센트로이드를 생성하는 것이 아니라, 센트로이드 사이의 거리를 최대한 멀리 위치시키는 방향으로 1개씩 총 k번 반복하여 k개의 클러스터를 만들어낸다는 뜻이다.
그렇다면 기존 K-Means 알고리즘과 사용 방식이 많이 다를까?
편리하게도 사이킷런(sklearn)에서는 K-Means++ 알고리즘을 보다 쉽게 사용할 수 있도록 제공해준다.
K-Means
from sklearn.cluster import KMeans
km = KMeans(init='random', n_clusters=3, random_state=42)
km.fit(fruits_2d)
K-Means++
from sklearn.cluster import KMeans
km = KMeans(init='k-means++', n_clusters=3, random_state=42)
km.fit(fruits_2d)
기존 K-Means의 코드에서 init 매개변수를 보면 'random'으로 설정되어 있다.
이 코드를 단순히 'k-means++'로 변경하기만 하면 위에서 설명한 과정을 알아서 수행해준다.
(이해가 다소 힘들거나, 틀린 부분이 있다면 댓글 부탁드리겠습니다! 😊)
💖댓글과 공감은 큰 힘이 됩니다!💖