4.1.1.1.DBSCAN_manual.md 3.35 KB
Newer Older
HooYoungAhn's avatar
HooYoungAhn committed
---
html:
  toc: true
  offline: true
export_on_save:
  html: true
---
# DBSCAN Operator
---
## Operator 설명
- 주변 데이터들의 밀도를 이용하여 군집을 생성해 나가는 방식이다.
- 밀도가 높은 지역에 있는 data points는 cluster에 할당하고 밀도가 낮은 지역에 있는 data points는 outlier points(noise points)로 본다.
</br>
</br>
- 아래 그림의 경우 최소 포인트가 6일 경우 클러스터 할당 모습이다. Epsilon 만큼 범위를 확대해 나가고 있다.
<img src=/images/4.1.1.1.DBSCAN.png>
    - 클러스터에 할당하기 위한 최소 조건이 min point가 6이상이어야 한다
하지만 z는 이웃이 5개, 2개 이므로 noise 포인트가 된다.
## Operator 파라미터 설명
- eps: core point로부터 cluster 테두리까지의 반경이며 이웃들의 크기를 정의 (required)
- minPts: eps 거리 내에 있어야만 하는 최소 데이터의 개수 (required)


## 작동순서
1. 입력 DataFrame의 유효성 검사를 진행한다. (Epsilon, min point, Numeric Columns)
2. 변수 초기화를 한다. (visitList, noistList, clusterMap)
3. Row 데이터의 이웃하는 목록을 가져온다.
4. 이웃하는 목록 리스트로 또 다시 이웃하는 목록 리스트를 구해온다. 방문기록을 남긴다.
5. 결과를 클러스터에 할당하거나 noise 기록을 한다
6. 모든 방문 기록이 완료 될 때까지 3 ~ 5 과정을 반복한다.
7. 출력 DataFrame을 생성한다.
## Operator 모듈 테스트 결과

### 입력 데이터
|index|   data1|    data2|
:--:|:---:|:--:
|    1| 6.848934849|3.158069218|
|    2|-0.943968337|22.91433149|
|    3|-1.175376171| 23.9929549|
|    4|-0.728804819|23.59998941|
|    5|-0.554106973|23.14728525|
|    6| -0.50858251|23.55578863|
|    7|-0.655966008|24.12991918|
|    8|-0.828753893|23.06295102|
|    9|-0.906446078|23.63442066|
|   10|-1.175471759|23.23088862|
|   11|-0.586424383|23.56802483|
|   12| 6.029774804|3.337247273|
|   13|-1.022162431|23.21138139|
|   14|-0.665984656|23.20667453|
|   15|-0.578946901|23.40512492|
|   16| -0.45042623|23.88963325|
|   17|-0.639808699|23.55207991|
|   18|-0.971141606|23.10933188|
|   19|-0.866241774|22.74841298|


### 결과 데이터

|index|   data1|    data2|    CLUSTER|
:--:|:---:|:---:|:--:
|    1| 6.848934849|3.158069218|      0|
|    2|-0.943968337|22.91433149|      1|
|    3|-1.175376171| 23.9929549|      0|
|    4|-0.728804819|23.59998941|      1|
|    5|-0.554106973|23.14728525|      1|
|    6| -0.50858251|23.55578863|      1|
|    7|-0.655966008|24.12991918|      0|
|    8|-0.828753893|23.06295102|      1|
|    9|-0.906446078|23.63442066|      1|
|   10|-1.175471759|23.23088862|      1|
|   11|-0.586424383|23.56802483|      1|
|   12| 6.029774804|3.337247273|      0|
|   13|-1.022162431|23.21138139|      1|
|   14|-0.665984656|23.20667453|      1|
|   15|-0.578946901|23.40512492|      1|
|   16| -0.45042623|23.88963325|      1|
|   17|-0.639808699|23.55207991|      1|
|   18|-0.971141606|23.10933188|      1|
|   19|-0.866241774|22.74841298|      1|

- 결과 데이터의 CLUSTER column에서 각 data들이 할당된 cluster를 보여준다.
- DBSCAN Operator에 의해 data들이 2개의 cluster에 할당 되었음을 알 수 있다.
- parameter는 다음과 같이 설정하였다.

```scala
val dBSCANInfo =
    DBSCANInfo.newBuilder()
    .setEps(0.5)
    .setMinPts(5)
    .build
```