Почему paired_distances sklearn намного медленнее, чем pairwise_distances, даже при вычислении одних и тех же данных? Как мы можем улучшить paired_distances?

#python #scikit-learn

#python #scikit-learn

Вопрос:

Я запускал этот простой код для вычисления матрицы расстояний X:

 import numpy as np
from sklearn.metrics import pairwise_distances
from sklearn.metrics.pairwise import paired_distances
import time

n = 10000
X = np.random.RandomState(0).rand(n, 5)

t0 = time.time()
pairwise_distances(X, X)
print(time.time() - t0)

X_tile = np.tile(X, (n, 1))
X_repeat = np.repeat(X, n, axis=0)

t1 = time.time()
paired_distances(X_tile, X_repeat)
print(time.time() - t1)
  

Это возвращает (на моем ноутбуке MacBook Pro 2014 года):

 7.2921271324157715
448.4537389278412
  

Две функции эффективно возвращают одни и те же значения. Что делает paired_distances 60x медленнее, чем pairwise_distances ? И если, скажем, нам нужно использовать paired_distances — возможно, потому, что мы ищем расстояния между точками в матрице до разных (возможно, случайных) наборов соседей (скажем, в матрице X мне нужны расстояния от X[0] до X[1], X[2] , тогда как для X[1] мне нужны расстояния до X[2], X[3] и т. Д.), Как мы можем улучшить егопроизводительность?

Комментарии:

1. Я получаю времена 1.44 и 3.85 — коэффициент ~ 2 согласуется с тем фактом, что pairwise_distances должен выполнять примерно половину вычислений as paired_distances (поскольку расстояние симметрично). Хотя я не знаю, что происходит с вами…

2. Из-за ограничений памяти я использовал в 10 раз меньше данных, но также получил результаты, совпадающие с результатами @bogovicj, равными 0,02439403533935547 и 0,04340338706970215, а также с коэффициентом около 2.