4.1.1.8.AgglomerativeClustering_manual.md 3.18 KB
Newer Older
HooYoungAhn's avatar
HooYoungAhn committed
---
html:
  toc: true
  offline: true
export_on_save:
  html: true
---
# Agglomerative clustering Operator
---
## Operator 설명
- 계층적 트리 모양을 이용해 개별 개체들을 순차적, 계층적으로 유사한 개체 그룹과 통합하여 군집화를 수행하는 알고리즘이다.<br>
1. 먼저 거리가 가장 가까운 것을 하나의 클러스터로 묶게 된다.
<img src="../images/4.1.1.8.Agglomerative_1.png">
HooYoungAhn's avatar
HooYoungAhn committed
2. 그 다음 또 다시 가장 가까운 것을 묶게 된다.
<img src="/images/4.1.1.8.Agglomerative_2.png">
3. 이런 식으로 모든 데이터가 하나로 묶을 때까지 반복 수행을 하게 된다.
<img src="../images/4.1.1.8.Agglomerative_3.png">
HooYoungAhn's avatar
HooYoungAhn committed
   - 만약 2개의 클러스터로 나누고 싶다면 아래와 같이 할당하면 된다.
<img src="../images/4.1.1.8.Agglomerative_4.png">
HooYoungAhn's avatar
HooYoungAhn committed
   - 거리계산 할 때의 사용된 방법에는 Single link, Complete link, Average link 방식을 사용하게 된다.<br>
Single link 방식은 클러스터 간의 최소 거리로 측정하게 된다.
<img src="../images/4.1.1.8.Agglomerative_5.png">
HooYoungAhn's avatar
HooYoungAhn committed
Complete link 방식은 클러스터 간의 최대 거리로 측정하게 된다.
<img src="../images/4.1.1.8.Agglomerative_6.png">
HooYoungAhn's avatar
HooYoungAhn committed
Average link 방식은 모든 점과의 거리를 평균 내 측정하게 된다.
<img src="../images/4.1.1.8.Agglomerative_7.png">
HooYoungAhn's avatar
HooYoungAhn committed

## Operator 파라미터 설명
- numberOfClusters: cluster의 개수 (required)
- link: cluster 사이의 거리 측정 방식. Enum(SINGLE, COMPLETE, AVERAGE), (required)

## 작동 순서
1. 입력 DataFrame의 유효성 검사를 진행한다. (cluster 개수, Numeric Columns)
2. 변수 초기화를 한다. (remaining, clusterMap)
3. 가장 거리가 가까운 것을 시작위치로 설정한다.
4. 거리를 계산하여 근접한 cluster는 병합되어 하나의 cluster로 생성이 되어간다.
5. cluster의 개수가 맞을 때까지 반복진행을 한다.
6. 출력 DataFrame을 생성한다.
## Operator 모듈 테스트 결과

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


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

```scala
val agglomerativeClusteringInfo = AgglomerativeClusteringInfo.newBuilder()
  .setNumberOfClusters(3)
  .setLink(LinkType.SINGLE)
  .build
```
- 거리 측정 방식은 SINGLE 방식(cluster 간의 최소 거리로 측정)으로 설정하였다.
- numberOfClusters를 3개로 설정해 주었으므로 3개의 cluster(0,1,2)에 data들이 할당되었음을 알 수 있다.