def dbscan(objects, Eps, MinPts):
id = 1
for o in objects:
if o.unclassified():
o.expandCluster(objects, Eps, MinPts, id)
id += 1
O algoritmo supõe que, inicialmente, todos os objetos de objects estão não-classificados. Abaixo, segue a função expandCluster() utilizada em dbscan().
def expandCluster(self, objects, Eps, MinPts, id):
N1 = self.epsNeighbourhood(Eps)
if len(N1)MinPts:
self.isNoise()
return
else:
setID(N1,id)
N1.remove(self)
for o in N1:
N2 = o.epsNeighbourhood(Eps)
if len(N2)MinPts:
# Selecionamos todos os objetos ainda
# não classificados ou ruidos;
# adicionamos os não classificados em N1;
# marcamos todos com o cluster-id atual
return
A função epsNeighbourhood(Eps) retorna uma lista com todos os objetos da vizinhança Eps de um obejto. A função isNoise() marca um objeto como sendo um ruído. A função setID(N,id) atribui a todos o objetos da lista um certo
. A figura
mostra uma comparação entre o resultado de um clustering por particionamento e um por densidade, para uma mesma base de dados.