def run(self): """ .. image:: ../fusim16/Cluster/final_presentation/clustertheorie.png :height: 250px :width: 400 px :alt: alternate text :align: right Es wird der DBSCAN-Algorithmus ausgefuehrt. Abhaengig von den eingefuegten Parametern wird der Klasse dbscan ein Vektor self.clusterByIndex (mit dem Typ: np.array (:math:`\mathbb{N}^N`)) zugefuegt. Mit :math:`N =` Anzahl der Datenpunkte. - Dabei stehen Nullen innerhalb des Vektors fuer Punkte die dem Noise zugerechnet werden (siehe Punkt N im Bild). Weitere Nummern entsprechen dem jeweiligem Cluster, dem der Punkt zugeordnet wurde. Wie Ausserdem durch das Bild veranschaulicht werden soll,gibt es zwei weitere Arten von Objekten. - Kernobjekte, welche selbst dicht sind. - Dichte-erreichbare Objekte. Dies sind Objekte, die zwar von einem Kernobjekt des Clusters erreicht werden koennen, selbst aber nicht dicht sind. Anschaulich bilden diese den Rand eines Clusters. Diese koennen auch nicht eindeutig immer den gleichen Clustern zugeordnet werden. """ print "start dbscan with episilon = %d and minPts = %d" % (self.eps, self.minPts) near = Neighbor(self.D, self.eps) for i in range(len(self.D)): if not self.visitedPoints[i]: self.visitedPoints[i] = True #select the neighbors by the parameter eps NeighborIndex = near.nnPca(self.D[i]) #if not enough neigbors are found, the point is "noise", else proceed if len(NeighborIndex) > (self.minPts): #create a new cluster and put the point in it self.clusterCount = self.clusterCount + 1 self.clusterByIndex[i] = self.clusterCount #now check every neighbor p' of p NGotBigger = True while NGotBigger: NGotBigger = False for indexOfPoint in NeighborIndex: if not self.visitedPoints[indexOfPoint]: self.visitedPoints[indexOfPoint] = True NeighborPrimeIndex = near.nnPca( self.D[indexOfPoint]) #if the point is not noise, then merge both neighborhoods if len(NeighborPrimeIndex) > (self.minPts): NeighborIndex = NeighborIndex.union( NeighborPrimeIndex) NGotBigger = True #if the point does not already belong to a cluster, put it this one if self.clusterByIndex[indexOfPoint] == 0: self.clusterByIndex[ indexOfPoint] = self.clusterCount
def run(self): """ .. image:: ../fusim16/Cluster/final_presentation/clustertheorie.png :height: 250px :width: 400 px :alt: alternate text :align: right Es wird der DBSCAN-Algorithmus ausgefuehrt. Abhaengig von den eingefuegten Parametern wird der Klasse dbscan ein Vektor self.clusterByIndex (mit dem Typ: np.array (:math:`\mathbb{N}^N`)) zugefuegt. Mit :math:`N =` Anzahl der Datenpunkte. - Dabei stehen Nullen innerhalb des Vektors fuer Punkte die dem Noise zugerechnet werden (siehe Punkt N im Bild). Weitere Nummern entsprechen dem jeweiligem Cluster, dem der Punkt zugeordnet wurde. Wie Ausserdem durch das Bild veranschaulicht werden soll,gibt es zwei weitere Arten von Objekten. - Kernobjekte, welche selbst dicht sind. - Dichte-erreichbare Objekte. Dies sind Objekte, die zwar von einem Kernobjekt des Clusters erreicht werden koennen, selbst aber nicht dicht sind. Anschaulich bilden diese den Rand eines Clusters. Diese koennen auch nicht eindeutig immer den gleichen Clustern zugeordnet werden. """ print "start dbscan with episilon = %d and minPts = %d" % (self.eps, self.minPts) near = Neighbor(self.D, self.eps) for i in range(len(self.D)): if not self.visitedPoints[i]: self.visitedPoints[i]= True #select the neighbors by the parameter eps NeighborIndex = near.nnPca(self.D[i]) #if not enough neigbors are found, the point is "noise", else proceed if len(NeighborIndex) > (self.minPts): #create a new cluster and put the point in it self.clusterCount = self.clusterCount + 1 self.clusterByIndex[i] = self.clusterCount #now check every neighbor p' of p NGotBigger = True while NGotBigger: NGotBigger = False for indexOfPoint in NeighborIndex: if not self.visitedPoints[indexOfPoint]: self.visitedPoints[indexOfPoint] = True NeighborPrimeIndex = near.nnPca(self.D[indexOfPoint]) #if the point is not noise, then merge both neighborhoods if len(NeighborPrimeIndex) > (self.minPts): NeighborIndex = NeighborIndex.union(NeighborPrimeIndex) NGotBigger = True #if the point does not already belong to a cluster, put it this one if self.clusterByIndex[indexOfPoint] == 0: self.clusterByIndex[indexOfPoint]= self.clusterCount
def run(self): """ Der DBSCAN Algorithmus wird durchgefuehrt :param D: eine Liste an Datenpunkten :param eps: Ein Punkt ist ein Nachbar wenn er im angegebenen Epsilon-Radius liegt :param minPts Ein Punkt ist ein Cluster-Punkt, wenn er mindestens diese Anzahl Nachbarn hat :return: clusterList,noise Eine Liste von Clustern, das ist ein Liste von Listen von Datenpunkten und eine Liste der Noiepsilonse, das ist eine Liste von Datenpunkten """ print "start dbscan with episilon = %d and minPts = %d" % (self.eps, self.minPts) clusterList = [] visitedPoints = [] noise = [] near = Neighbor(self.D, self.eps) for point in self.D: if not self.visited(point, visitedPoints): visitedPoints.append(point) #select the neighbors by the parameter eps N = near.nnPca(point) #if not enough neigbors are found, the point is "noise", else proceed if N.shape[0] < (self.minPts): noise.append(point) else: #create a new cluster and put the point in it C = [] C.append(point) #now check every neighbor p' of p for pointPrime in N: if not self.visited(pointPrime, visitedPoints): visitedPoints.append(pointPrime) NPrime = near.nnPca(pointPrime) #if the point is not noise, then merge both neighborhoods if NPrime.shape[0] >= (self.minPts): N = np.concatenate((N, NPrime), axis=0) #if the point does not already belong to a cluster, put it this one if not self.inCluster(pointPrime, clusterList): C.append(pointPrime) #and save the cluster in our list of clusters clusterList.append(C) print "Cluster List:" for cl in clusterList: print cl print "Noise:" print noise return clusterList,noise
def test_neighbor_2d(self): #create simple data: a = range(0, 11) d = [] for i in a: for j in a: d.append([i, j]) n = Neighbor(array(d), 1.01) neighbors = n.nnPca(array([5,5])) print "neighbors of [5, 5] with eps = 1.01: " + str(neighbors) assert neighbors.shape == (4,2)
def test_neighbor_3d(self): #create simple data: a = range(0, 11) d = [] for i in a: for j in a: for k in a: d.append([i*1.0, j*1.0, k*1.0]) n = Neighbor(np.array(d), 1.01) neighbors = n.nnPca(np.array([5*1.0,5*1.0,5*1.0])) print "neighbors of [5, 5, 5] with eps = 1.01: " + str(neighbors) assert len(neighbors) == 7
def test_neighbor_3d(self): #create simple data: a = range(0, 11) d = [] for i in a: for j in a: for k in a: d.append([i * 1.0, j * 1.0, k * 1.0]) n = Neighbor(np.array(d), 1.01) neighbors = n.nnPca(np.array([5 * 1.0, 5 * 1.0, 5 * 1.0])) print "neighbors of [5, 5, 5] with eps = 1.01: " + str(neighbors) assert len(neighbors) == 7
def test_neighbor_2d(self): #create simple data: a = range(0, 11) d = [] for i in a: for j in a: d.append(np.array([i*1.0, j*1.01])) n = Neighbor(np.array(d), 1.01) neighbors = n.nnPca(np.array([5.0,5.0])) print "neighbors of [5, 5] with eps = 1.01: " + str(neighbors) for n in neighbors: print d[n] assert len(neighbors) == 5
def test_neighbor_2d(self): #create simple data: a = range(0, 11) d = [] for i in a: for j in a: d.append(np.array([i * 1.0, j * 1.01])) n = Neighbor(np.array(d), 1.01) neighbors = n.nnPca(np.array([5.0, 5.0])) print "neighbors of [5, 5] with eps = 1.01: " + str(neighbors) for n in neighbors: print d[n] assert len(neighbors) == 5