Beispiel #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
Beispiel #2
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
Beispiel #3
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