4.1.1.4.KMeans_manual.md 3.01 KB
Newer Older
HooYoungAhn's avatar
HooYoungAhn committed
---
html:
  toc: true
  offline: true
export_on_save:
  html: true
---
# KMeans Operator
---
## Operator 설명
- n개의 data를 k개의 cluster로 나누는 것을 목적으로 하고 있다.
- 입력 데이터 집합의 각 데이터들과 k개의 cluster 중심점과의 거리를 각각 구하고 각 data는 가장 유사도가 높은 중심점에 각 데이터를 할당하게 된다.<br>
<img src="/images/4.1.1.4.kmeans_1.png" width="300">
1. 입력 데이터 집합에서 K(3)개의 데이터를 임의로 추출하고 이 데이터를 각 cluster의 중심으로 설정한다. 입력 데이터 집합의 각 데이터 들과 k개의 cluster 중심점과의 거리를 각각 구하고, 가장 유사도가 높은 중심점에 각 데이터를 할당하게 된다.
<img src="/images/4.1.1.4.kmeans_2.png" width="300">
2. 모두 할당하였으면 cluster의 중심점을 다시 계산한다.
<img src="/images/4.1.1.4.kmeans_3.png" width="300">
3. cluster가 바뀌지 않을 때까지 반복적으로 거리계산 및 cluster 할당 작업을 수행을 하게 된다.
## Operator 파라미터 설명
- k_value: cluster의 개수 (required)
- maxIterations: k-Means를 한번 수행할 때 수행되는 최대 반복 횟수. KMeans 시도 횟수 (required)
- maxRuns: 최적화된 임의 지점을 찾기 위한 시도 횟수 (optional)
- seed: random seed 값 (optional)

## 작동순서
1. 입력 DataFrame의 유효성 검사를 진행한다. (Numeric Columns)
2. DataFrame을 Vectors로 변환한다.
3. Spark ml의 KMeans 알고리즘을 실행한다.
4. 출력 DataFrame을 생성한다.

## Operator 모듈 테스트 결과

### 입력 데이터
|index|   data1|    data2|    data3|    data4|    data5|
:--:|:---:|:---:|:---:|:---:|:--:
|    1|91.5775| 81.572|   84|73.2035|79.5918|
|    2|83.4467|72.9477|   92|60.6273|75.1917|
|    3|47.0239|51.3076|   31| 25.807|36.0382|
|    4|69.9559|61.0005|   76| 76.643|71.2145|
|    5|57.2462|53.9258|   79|65.2266|66.0508|
|    6|42.8488|46.1728|    7|31.9797|28.3842|
|    7|73.7949|64.0751|   98|61.2696|74.4483|
|    8|22.4626|31.7166|    6| 28.549|22.0886|

### 결과 데이터
|index|   data1|    data2|    data3|    data4|    data5|    CLUSTER|
:--:|:---:|:---:|:---:|:---:|:---:|:--:
|    1|91.5775| 81.572|   84|73.2035|79.5918|      0|
|    2|83.4467|72.9477|   92|60.6273|75.1917|      0|
|    3|47.0239|51.3076|   31| 25.807|36.0382|      1|
|    4|69.9559|61.0005|   76| 76.643|71.2145|      0|
|    5|57.2462|53.9258|   79|65.2266|66.0508|      0|
|    6|42.8488|46.1728|    7|31.9797|28.3842|      1|
|    7|73.7949|64.0751|   98|61.2696|74.4483|      0|
|    8|22.4626|31.7166|    6| 28.549|22.0886|      1|

- 결과 데이터의 CLUSTER column에서 각 data들이 할당된 cluster를 보여준다.
- K 값을 2로 설정하였으므로 위와 같이 2개의 cluster에 data들이 할당되는 것을 알 수 있다.
- parameter는 다음과 같이 설정 하였다.
```scala
val kMeansInfo = KMeansInfo.newBuilder()
  .setKValue(2)
  .setMaxIterations(100)
  .setMaxRuns(10)
  .setSeed(7)
  .build
```