Newer
Older
---
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 만큼 범위를 확대해 나가고 있다.
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
- 클러스터에 할당하기 위한 최소 조건이 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
```