def test_eps_neighborhood(self): distances = CondensedMatrix([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 1., 1., 1., 1., 1., 3., 1., 1., 1., 1., 2., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 1. ]) dbscan_alg = DBSCANAlgorithm(distances) self.assertItemsEqual( dbscan_alg._DBSCANAlgorithm__eps_neighborhood(6, 3), [0, 1, 2, 3, 4, 5, 7, 8]) self.assertItemsEqual( dbscan_alg._DBSCANAlgorithm__eps_neighborhood(6, 2), [0, 1, 3, 4, 5, 7, 8]) self.assertItemsEqual( dbscan_alg._DBSCANAlgorithm__eps_neighborhood(6, 1), [0, 4, 5, 7]) self.assertItemsEqual( dbscan_alg._DBSCANAlgorithm__eps_neighborhood(6, 1.), [0, 4, 5, 7]) self.assertItemsEqual(distances.element_neighbors_within_radius(6, 3), [0, 1, 2, 3, 4, 5, 7, 8]) self.assertItemsEqual(distances.element_neighbors_within_radius(6, 2), [0, 1, 3, 4, 5, 7, 8]) self.assertItemsEqual(distances.element_neighbors_within_radius(6, 1), [0, 4, 5, 7]) self.assertItemsEqual(distances.element_neighbors_within_radius(6, 1.), [0, 4, 5, 7])
def test_dbscan_regression_mini(self): distances = CondensedMatrix([ 12.36931688, 5.83095189, 9.43398113, 12.52996409, 15.65247584, 17.4642492, 9.21954446, 4.47213595, 3.16227766, 4.47213595, 5.65685425, 5., 8.06225775, 11.18033989, 13.15294644, 3.16227766, 6.32455532, 8.24621125, 3.16227766, 5.09901951, 2. ]) dbscan_alg = DBSCANAlgorithm(distances) clustering = dbscan_alg.perform_clustering(kwargs={ "eps": 4.0, "minpts": 3 }) self.assertItemsEqual(clustering.gen_class_list(starts_with=1), [-1, 1, -1, 1, 1, 1]) #[0, 1, 0, 1, 1, 1, 0]
def test_dbscan(self): distances = CondensedMatrix([0., 0., 2., 2., 0., 2., 2., 2., 2., 0.]) dbscan_alg = DBSCANAlgorithm(distances) eps = 1.0 minpts = 2 clustering = dbscan_alg.perform_clustering(kwargs={ "eps": eps, "minpts": minpts }) expected = [1, 1, 1] self.assertItemsEqual(clustering.gen_class_list(starts_with=1), expected) dbscan_alg.element_class = [PointClassType.UNCLASSIFIED] * 5 eps = 1.0 minpts = 1 clustering = dbscan_alg.perform_clustering(kwargs={ "eps": eps, "minpts": minpts }) self.assertItemsEqual(clustering.gen_class_list(starts_with=1), [1, 1, 1, 2, 2])
def test_seed_expansion(self): """ Graph: 1--2 3--4 \ / 0 Adj. list: 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 Inv. distance adjacency list (two nodes are connected if their distance is lower than x) 0 0 x x x 0 x x x x x x x x 0 """ distances = CondensedMatrix([0., 0., 2., 2., 0., 2., 2., 2., 2., 0.]) N = distances.row_length dbscan_alg = DBSCANAlgorithm(distances) eps = 1.0 minpts = 2 elements_class = [PointClassType.UNCLASSIFIED] * N dbscan_alg._DBSCANAlgorithm__seed_expansion(1, eps, minpts, [2], elements_class) expected_classes = [ 1, 1, 1, PointClassType.UNCLASSIFIED, PointClassType.UNCLASSIFIED ] self.assertItemsEqual(expected_classes, elements_class) elements_class = [PointClassType.UNCLASSIFIED] * N dbscan_alg._DBSCANAlgorithm__seed_expansion(2, eps, minpts, [3], elements_class) expected_classes = [ PointClassType.UNCLASSIFIED, PointClassType.UNCLASSIFIED, PointClassType.UNCLASSIFIED, PointClassType.UNCLASSIFIED, PointClassType.UNCLASSIFIED ] self.assertItemsEqual(expected_classes, elements_class) minpts = 1 dbscan_alg._DBSCANAlgorithm__seed_expansion(2, eps, minpts, [3], elements_class) expected_classes = [ PointClassType.UNCLASSIFIED, PointClassType.UNCLASSIFIED, PointClassType.UNCLASSIFIED, 2, 2 ] self.assertItemsEqual(expected_classes, elements_class) elements_class = [PointClassType.UNCLASSIFIED] * N dbscan_alg._DBSCANAlgorithm__seed_expansion(1, eps, minpts, [2, 4], elements_class) expected_classes = [1, 1, 1, 1, 1] self.assertItemsEqual(expected_classes, elements_class)