Расчет евклидовых расстояний с помощью Python выполняется слишком медленно - PullRequest
0 голосов
/ 06 мая 2019

Я читаю наборы данных из файла в numpy массивы, подобные этому:

def read_data(filename):
   data = np.empty(shape=[0, 65], dtype=int)
   with open(filename) as f:
       for line in f:
           data = np.vstack((data, np.array(list(map(int, line.split(','))), dtype=int)))
   return data

Я использую numpy для расчета евклидова расстояния между двумя списками:

def euclidean_distance(x, z):
   return np.linalg.norm(x-z)

После этого я вычисляю евклидовы расстояния следующим образом:

for data in testing_data:
   for data2 in training_data:
       dist = euclidean_distance(data, data2)

Моя проблема в том, что этот код работает очень медленно, его завершение занимает ~ 10 минут. Как я могу улучшить это, что мне не хватает?
Я должен использовать расстояния в другом алгоритме, поэтому скорость очень важна.

1 Ответ

1 голос
/ 06 мая 2019

Вы можете использовать sklearn.metrics.pairwise_distances, что позволяет распределять работу по всем вашим ядрам. Параллельное построение матрицы расстояний обсуждает ту же тему и дает хорошее обсуждение различий pdist, cdist и pairwise_distances

Если я правильно понимаю ваш пример,Вы хотите расстояние между каждым образцом в тренировочном наборе и каждым образцом в испытательном наборе.Для этого вы можете использовать:

dist = pairwise_distances(training_data, testing_data, n_jobs=-1)
...