Давайте сделаем несколько быстрых тестов для вычисления сходства косинусов, чтобы у нас было базовое представление о его производительности
timeit.timeit('cosine_similarity(x,y)',setup='from sklearn.metrics.pairwise import cosine_similarity; import numpy as np; x,y = np.random.random(100),np.random.random(100)',number=20000)
4.5380048290098784
timeit.timeit('cosine(x,y)',setup='from scipy.spatial.distance import cosine; import numpy as np; x,y = np.random.random(100),np.random.random(100)',number=20000)
0.6468068649992347
Так что кажется, что scipy's
косинус превосходит значение sklearn
, поэтому мы, вероятно, выиграли 'Выгода от переключения реализации ... Продолжается.
Если вы хотите выполнить попарно-косинусное сходство для матрицы из 17 тыс. записей, то это примерно равно 17k^2
оценкам == 289,000,000
, что ужемного, и особенно, если ваши векторы также являются многомерными.
Давайте посмотрим, как быстро можно получить косинусное сходство на thousandth
ваших входных данных, поэтому 289,000
оценки.
timeit.timeit('cosine(x,y)',setup='from scipy.spatial.distance import cosine; import numpy as np; x,y = np.random.random(100),np.random.random(100)',number=int((17000**2)/1000))
9.857225538988132
Это займет около 10 секунд.Поскольку это число растет линейно с ростом количества случаев ... Вы можете ожидать, что потратите 10000 секунд или чуть менее 3 часов на выполнение около 300 миллионов операций по подобию косинусов (в моем случае для векторов длины 100).
Таким образом, вычисление подобия косинуса должно занять определенное время.Одним из способов потенциального улучшения вашего кода является сохранение косинусных сходств в новом кадре данных или новой серии, а затем подключение его к исходному кадру данных с использованием индекса, в отличие от добавления к кадру данных на каждой итерации цикла.используя метод at
(возможно, очень медленный).
Если все это имеет смысл, тогда ваша вычислительная нагрузка достаточно высока, так что ноутбук начинает чувствовать себя слабым.Что вы делаете дальше, зависит от вашего варианта использования - нужно ли это делать один раз?Просто запустите его и забудьте об этом.
Нужно делать это время от времени, но не слишком часто?Распараллелите вашу реализацию (если у вас есть четыре ядра, используйте все сразу), используя модуль multiprocessing
в python (важно не использовать multithreading
, в этом случае он не будет работать).
Нужно часто это запускать?Вам может понадобиться больше оборудования или посмотреть на решения для облачных вычислений - вы будете удивлены, насколько доступной может быть правильно управляемая облачная вычислительная установка.