Решаю задачу по машинному обучению. Одна из частей задания - реализовать вычисление расстояний между точками данными для тренировки и тестовыми точками. Задание разбито на 3 части: реализация с использованием двух циклов, реализация с использованием одного цикла, реализация без использования циклов. Я читал о том, что использование возможностей numpy должно ускорять программу. Но в моём случае я имею следующие результаты:
Запускаю вычисление расстояний между 3000 тренировочными точками и 300 тестовыми.
158 ms ± 20 для реализации с двумя циклами
209 ms ± 33.8 для реализации с одним циклом
201 ms ± 29.5 ms per loop для реализации без циклов
Реализация вычисления матрицы расстояний следующая:
def compute_distances_two_loops(self, X): num_train = self.train_X.shape[0] num_test = X.shape[0] dists = np.zeros((num_test, num_train), np.float32) for i_test in range(num_test): for i_train in range(num_train): dists[i_test][i_train] = np.linalg.norm(X[i_test] - self.train_X[i_train], ord = 2) return dists def compute_distances_one_loop(self, X): num_train = self.train_X.shape[0] num_test = X.shape[0] dists = np.zeros((num_test, num_train), np.float32) for i_test in range(num_test): dists[i_test] = np.linalg.norm(X[i_test] - self.train_X[:], axis = 1, ord = 2) return dists def compute_distances_no_loops(self, X): dists = X[:, None] - self.train_X[:] return np.linalg.norm(dists, axis = 2, ord = 2)
Подскажите, что я делаю не так? Или результаты абсолютно нормальны?