Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 28, 2020 06:44:38

Emorh
Зарегистрирован: 2020-01-27
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Ускорение при использовании numpy

Здравствуйте!
Решаю задачу по машинному обучению. Одна из частей задания - реализовать вычисление расстояний между точками данными для тренировки и тестовыми точками. Задание разбито на 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)

Подскажите, что я делаю не так? Или результаты абсолютно нормальны?

Офлайн

#2 Янв. 28, 2020 07:12:43

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Ускорение при использовании numpy

Как часто бывает проблема похоже том что вы не привели.
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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version