Как уже упоминалось в разделе комментариев, я не думаю, что сравнение справедливо в основном потому, что sklearn.metrics.pairwise.cosine_similarity
предназначен для сравнения попарного расстояния / подобия выборок в заданных входных 2-мерных массивах. С другой стороны, scipy.spatial.distance.cosine
предназначен для вычисления косинусного расстояния двух 1-D массивов.
Возможно, более справедливое сравнение - использовать scipy.spatial.distance.cdist
против sklearn.metrics.pairwise.cosine_similarity
, где оба вычисляют попарно расстояние образцы в заданных массивах. Однако, к моему удивлению, это показывает, что реализация sklearn намного быстрее, чем реализация scipy (которой у меня сейчас нет объяснения!). Вот эксперимент:
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from scipy.spatial.distance import cdist
x = np.random.rand(1000,1000)
y = np.random.rand(1000,1000)
def sklearn_cosine():
return cosine_similarity(x, y)
def scipy_cosine():
return 1. - cdist(x, y, 'cosine')
# Make sure their result is the same.
assert np.allclose(sklearn_cosine(), scipy_cosine())
И вот результат синхронизации:
%timeit sklearn_cosine()
10 loops, best of 3: 74 ms per loop
%timeit scipy_cosine()
1 loop, best of 3: 752 ms per loop