---
html:
toc: true
offline: true
export_on_save:
html: true
---
# EM Clustering Operator
---
## Operator 설명
- k개의 cluster로 분할하기 위해 반복적으로 두 단계(기댓값 단계,최대화 단계)를 수행한다.
- EM 알고리즘은 매개변수에 관한 추정값으로 로그가능도(log likelihood)의 기댓값을 계산하는 기댓값 (E) 단계와 이 기댓값을 최대화하는 변수값을 구하는 최대화 (M) 단계를 번갈아가면서 적용한다. 최대화 단계에서 계산한 변수값은 다음 기댓값 단계의 추정값으로 쓰인다.
## Operator 파라미터 설명
- k_value: cluster의 개수 (required)
- maxIter: EMClustering을 한번 수행할 때 수행되는 최대 반복 횟수. EMClustering 시도 횟수(required)
## 작동순서
1. 입력 DataFrame의 유효성 검사를 진행한다. (K값, maxIter, Numeric Columns)
2. 입력 DataFrame을 Vectors로 변환 후 featurs 칼럼에 재생성한다.
3. Spark ml의 GaussianMixture 알고리즘을 사용한다. (expectation maximization 수행)
4. 출력 DataFrame을 생성한다.
## Operator 모듈 테스트 결과
### 입력 데이터
|a1| a2| a3| a4|
|:---:|:---:|:---:|:---:|
|5.1|3.5|1.4|0.2|
|4.9|3.0|1.4|0.2|
|4.7|3.2|1.3|0.2|
|4.6|3.1|1.5|0.2|
|5.0|3.6|1.4|0.2|
|5.4|3.9|1.7|0.4|
|4.6|3.4|1.4|0.3|
|5.0|3.4|1.5|0.2|
|4.4|2.9|1.4|0.2|
|4.9|3.1|1.5|0.1|
|5.4|3.7|1.5|0.2|
|4.8|3.4|1.6|0.2|
|4.8|3.0|1.4|0.1|
|4.3|3.0|1.1|0.1|
|5.8|4.0|1.2|0.2|
### 결과 데이터
|index| a1| a2| a3| a4|cluster|
|:---:|:---:|:---:|:---:|:---:|:---:|
| 1|5.1|3.5|1.4|0.2| 0|
| 2|4.9|3.0|1.4|0.2| 0|
| 3|4.7|3.2|1.3|0.2| 0|
| 4|4.6|3.1|1.5|0.2| 0|
| 5|5.0|3.6|1.4|0.2| 0|
| 6|5.4|3.9|1.7|0.4| 1|
| 7|4.6|3.4|1.4|0.3| 0|
| 8|5.0|3.4|1.5|0.2| 0|
| 9|4.4|2.9|1.4|0.2| 0|
| 10|4.9|3.1|1.5|0.1| 0|
| 11|5.4|3.7|1.5|0.2| 0|
| 12|4.8|3.4|1.6|0.2| 0|
| 13|4.8|3.0|1.4|0.1| 0|
| 14|4.3|3.0|1.1|0.1| 1|
| 15|5.8|4.0|1.2|0.2| 1|
- 결과 데이터의 cluster column에서 각 data들이 할당된 cluster를 보여준다.
- K 값을 2로 설정하였으므로 위와 같이 2개의 cluster에 data들이 할당되는 것을 알 수 있다.
- parameter는 다음과 같이 설정하였다.
```scala
val eMClusteringInfo =
EMClusteringInfo.newBuilder()
.setKValue(2)
.setMaxIter(100)
.build
```