Форум сайта python.su
Здравствуйте!
Решаю задачу по машинному обучению. Одна из частей задания - реализовать вычисление расстояний между точками данными для тренировки и тестовыми точками. Задание разбито на 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)
Офлайн
Как часто бывает проблема похоже том что вы не привели.
9.319131675
0.5032883930000001
0.11343997400000028
import numpy as np from time import perf_counter X=np.zeros((30000,5)) train_X = np.zeros((30,5)) def compute_distances_two_loops(): num_train = 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] - train_X[i_train], ord = 2) return dists def compute_distances_one_loop(): num_train = 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] - train_X[:], axis = 1, ord = 2) return dists def compute_distances_no_loops(): dists = X[:, None] - train_X[:] return np.linalg.norm(dists, axis = 2, ord = 2) X=np.zeros((30000,5)) train_X = np.zeros((30,5)) li= [compute_distances_two_loops,compute_distances_one_loop,compute_distances_no_loops] for i in li: t0=perf_counter() i() t1=perf_counter() print(t1-t0) 9.319131675 0.5032883930000001 0.11343997400000028
Отредактировано doza_and (Янв. 28, 2020 07:13:23)
Офлайн