Пример #1
0
    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
Пример #2
0
 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)
Пример #3
0
 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
Пример #4
0
    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
Пример #5
0
 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
Пример #6
0
 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
Пример #7
0
 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
Пример #8
0
 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