Skip to content

Commit e0b0b5d

Browse files
author
Abdelrahman
committed
Add DenStream using DBSCAN (2)
1 parent 38b31f8 commit e0b0b5d

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

cluster/denstream.py

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
https://github.com/Waikato/moa/blob/master/moa/src/main/java/moa/clusterers/denstream/WithDBSCAN.java
55
"""
66
import logging
7-
from typing import Iterable, Any
7+
from typing import Dict, List, Iterable, Any
8+
9+
from py4j.java_gateway import JavaGateway
810

911
from utils import setup_logger, setup_java_gateway
1012

@@ -64,10 +66,11 @@ def __init__(self,
6466
self._lambda_ = lambda_
6567
self._processing_speed = processing_speed
6668

67-
self._gateway = setup_java_gateway(imports=_IMPORTS)
69+
self._gateway: JavaGateway = setup_java_gateway(imports=_IMPORTS)
6870

69-
self._header = self._generate_header()
70-
self._clusterer = self._initialize_clusterer()
71+
self._header: Any = self._generate_header()
72+
self._clusterer: Any = self._initialize_clusterer()
73+
self._instances: List[Any] = []
7174

7275
@property
7376
def window_range(self) -> float:
@@ -155,6 +158,17 @@ def _initialize_clusterer(self) -> Any:
155158

156159
return clusterer
157160

161+
def _create_instance(self, vector) -> Any:
162+
"""Create instance."""
163+
instance = self._gateway.jvm.DenseInstance(self._dimensions)
164+
165+
for index, number in enumerate(vector):
166+
instance.setValue(index, number)
167+
168+
instance.setDataset(self._header)
169+
170+
return instance
171+
158172
def transform(self) -> None:
159173
"""Transform."""
160174
raise NotImplementedError
@@ -166,14 +180,10 @@ def partial_fit(self, batch: Iterable[Iterable[float]]) -> None:
166180
:param batch: An iterable of vectors.
167181
"""
168182
for vector in batch:
169-
instance = self._gateway.jvm.DenseInstance(self._dimensions)
170-
171-
for index, number in enumerate(vector):
172-
instance.setValue(index, number)
173-
174-
instance.setDataset(self._header)
183+
instance = self._create_instance(vector)
175184

176185
self._clusterer.trainOnInstanceImpl(instance)
186+
self._instances.append(instance)
177187

178188
def fit(self, batch: Iterable[Iterable[float]]) -> None:
179189
"""
@@ -182,3 +192,13 @@ def fit(self, batch: Iterable[Iterable[float]]) -> None:
182192
:param batch: An iterable of vectors.
183193
"""
184194
self.partial_fit(batch)
195+
196+
def get_clustering_result(self) -> Dict[int, int]:
197+
"""
198+
Get clustering result.
199+
200+
Result is in the form {
201+
'point_index': cluster_index
202+
}
203+
"""
204+
return self._clusterer.getClusteringResult().classValues(self._instances)

0 commit comments

Comments
 (0)