def test_nearest_neighbour_random(self): for seed in range(1, 10): random.seed(seed) points = [self.random_point(100) for _ in range(100)] point = self.random_point(100) closest = sorted(points, key=lambda x: distance(point, x)) tree = KdTree(points) self.assertTupleEqual( tree.nearest_neighbour(point, 1)[0].point, closest[0]) nearest = tree.nearest_neighbour(point, 10) for n, c in zip(nearest, closest): self.assertTupleEqual(n.point, c)
def test_nearest_neighbour_big(self): # creating tree - 36 s # finding nn - 0.3 ms # nth element - 1.37 ms # sort - 1.2 ms random.seed(42) points = [(random.randint(-100000, 100000), random.randint(-100000, 100000), random.randint(-100000, 100000)) for _ in range(25000)] point = (random.randint(-100000, 100000), random.randint(-100000, 100000), random.randint(-100000, 100000)) closest = (-10000000, -10000000, -10000000) for p in points: if distance(point, p) < distance(point, closest): closest = p start = timeit.default_timer() tree = KdTree(points) print('Creating tree', timeit.default_timer() - start) start = timeit.default_timer() nearest = tree.nearest_neighbour(point, 100) print('Searching NN', timeit.default_timer() - start) self.assertTupleEqual(nearest[0].point, closest)
def test_nearest_neighbour(self): tree = KdTree([(1, )]) nearest = tree.nearest_neighbour((-3, ), 1) self.assertTupleEqual(nearest[0].point, (1, )) tree = KdTree([(1, 3), (2, 4)]) nearest = tree.nearest_neighbour((0, 2), 1) self.assertTupleEqual(nearest[0].point, (1, 3)) nearest = tree.nearest_neighbour((3, 5), 1) self.assertTupleEqual(nearest[0].point, (2, 4)) tree = KdTree([(1, 3, 3), (4, 8, 7), (2, -1, 2), (3, 4, 1)]) nearest = tree.nearest_neighbour((1, 2, 0), 1) self.assertTupleEqual(nearest[0].point, (3, 4, 1)) tree = KdTree([(-1, 1), (0, -2), (1, -2)]) nearest = tree.nearest_neighbour((1, 2), 1) self.assertTupleEqual(nearest[0].point, (-1, 1))