- k개의 cluster로 분할하기 위해 반복적으로 두 단계(기댓값 단계,최대화 단계)를 수행한다.
- EM 알고리즘은 매개변수에 관한 추정값으로 로그가능도(log likelihood)의 기댓값을 계산하는 기댓값 (E) 단계와 이 기댓값을 최대화하는 변수값을 구하는 최대화 (M) 단계를 번갈아가면서 적용한다. 최대화 단계에서 계산한 변수값은 다음 기댓값 단계의 추정값으로 쓰인다.
- k_value: cluster의 개수 (required)
- maxIter: EMClustering을 한번 수행할 때 수행되는 최대 반복 횟수. EMClustering 시도 횟수(required)
- 입력 DataFrame의 유효성 검사를 진행한다. (K값, maxIter, Numeric Columns)
- 입력 DataFrame을 Vectors로 변환 후 featurs 칼럼에 재생성한다.
- Spark ml의 GaussianMixture 알고리즘을 사용한다. (expectation maximization 수행)
- 출력 DataFrame을 생성한다.
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는 다음과 같이 설정하였다.
val eMClusteringInfo =
EMClusteringInfo.newBuilder()
.setKValue(2)
.setMaxIter(100)
.build