Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
---
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
```