- n개의 data를 k개의 클러스터로 나누는 것을 목적으로 하고 있다.
- 임의의 medoid 개수(k개)를 지정한다. medoid가 아닌 다른 객체를 임의로 지정하여 본래의 medoid와 임이의 medoid 간의 총 cost를 비교하여 임이의 medoid의 cost가 작으면 medoid를 임이의 medoid로 교체해준다.
Data object |
Distance to |
Index |
Xi |
c1= (3,4) |
c2= (7,4) |
1 |
(2,6) |
3 |
7 |
2 |
(3,4) |
0 |
4 |
3 |
(3,8) |
4 |
8 |
4 |
(4,7) |
4 |
6 |
5 |
(6,2) |
5 |
3 |
6 |
(6,4) |
3 |
1 |
7 |
(7,3) |
5 |
1 |
8 |
(7,4) |
4 |
0 |
9 |
(8,5) |
6 |
2 |
10 |
(7,6) |
6 |
2 |
Cost |
11 |
9 |
C1, C2와의 거리 계산 비용이다. X(2, 6)은 C1에 할당하게 된다. 즉 비용이 적으면 근접하다고 판단된다.(거리계산은 Manhattan 측정 방식 사용)
- k_value: cluster의 개수 (required)
- maxIter: KMedoids를 한번 수행할 때 수행되는 최대 반복 횟수. KMedoids 시도 횟수 (required)
- seed: random seed 값 (optional)
- 입력 DataFrame의 유효성 검사를 진행한다. (K값, Numeric Columns)
- 임의의 KMedoids 개수를 할당한다.
- 총 거리 비용으로 메도이드를 결정한다. (거리계산은 Manhattan 측정 방식 사용)
- 중심을 바꿔가며 계속 찾아나가 근접한 경우(비용이 적은) 메도이드를 변경해준다.
- 최종 메도이드가 결정되면 메도이드를 중심으로 근접하는 클러스터를 할당한다.
- 출력 DataFrame을 생성한다.
data1 |
data2 |
2 |
6 |
3 |
4 |
3 |
8 |
4 |
7 |
6 |
2 |
6 |
4 |
7 |
3 |
7 |
4 |
8 |
5 |
7 |
6 |
index |
data1 |
data2 |
CLUSTER |
1 |
2 |
6 |
0 |
2 |
3 |
4 |
0 |
3 |
3 |
8 |
0 |
4 |
4 |
7 |
0 |
5 |
6 |
2 |
1 |
6 |
6 |
4 |
1 |
7 |
7 |
3 |
1 |
8 |
7 |
4 |
1 |
9 |
8 |
5 |
1 |
10 |
7 |
6 |
1 |
- 결과 데이터의 CLUSTER column에서 각 data들이 할당된 cluster를 보여준다.
- K 값을 2로 설정하였으므로 위와 같이 2개의 cluster에 data들이 할당되는 것을 알 수 있다.
- parameter는 다음과 같이 설정 하였다.
val kMedoidsInfo = KMedoidsInfo.newBuilder()
.setKValue(2)
.setMaxIter(100)
.setSeed(7)
.build