--- html: toc: true offline: true export_on_save: html: true --- # KMeans Operator --- ## Operator 설명 - n개의 data를 k개의 cluster로 나누는 것을 목적으로 하고 있다. - 입력 데이터 집합의 각 데이터들과 k개의 cluster 중심점과의 거리를 각각 구하고 각 data는 가장 유사도가 높은 중심점에 각 데이터를 할당하게 된다.
1. 입력 데이터 집합에서 K(3)개의 데이터를 임의로 추출하고 이 데이터를 각 cluster의 중심으로 설정한다. 입력 데이터 집합의 각 데이터 들과 k개의 cluster 중심점과의 거리를 각각 구하고, 가장 유사도가 높은 중심점에 각 데이터를 할당하게 된다. 2. 모두 할당하였으면 cluster의 중심점을 다시 계산한다. 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 ```