---
html:
toc: true
offline: true
export_on_save:
html: true
---
# KMedoids Operator
---
## Operator 설명
- 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 측정 방식 사용)
## Operator 파라미터 설명
- k_value: cluster의 개수 (required)
- maxIter: KMedoids를 한번 수행할 때 수행되는 최대 반복 횟수. KMedoids 시도 횟수 (required)
- seed: random seed 값 (optional)
##작동 순서
1. 입력 DataFrame의 유효성 검사를 진행한다. (K값, Numeric Columns)
2. 임의의 KMedoids 개수를 할당한다.
3. 총 거리 비용으로 메도이드를 결정한다. (거리계산은 Manhattan 측정 방식 사용)
4. 중심을 바꿔가며 계속 찾아나가 근접한 경우(비용이 적은) 메도이드를 변경해준다.
5. 최종 메도이드가 결정되면 메도이드를 중심으로 근접하는 클러스터를 할당한다.
6. 출력 DataFrame을 생성한다.
## Operator 모듈 테스트 결과
### 입력 데이터
| 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는 다음과 같이 설정 하였다.
```scala
val kMedoidsInfo = KMedoidsInfo.newBuilder()
.setKValue(2)
.setMaxIter(100)
.setSeed(7)
.build
```