4.1.1.2.EMClustering_manual.md 2.55 KB
Newer Older
HooYoungAhn's avatar
HooYoungAhn committed
---
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
```