Мне нужно вычислить косинусное сходство между двумя списками , скажем, например, список 1, который есть, dataSetI
и список 2, который есть dataSetII
. Я не могу использовать ничего, например numpy или модуль статистики. Я должен использовать общие модули (математику и т. Д.) (Причем как можно меньше модулей, чтобы сократить затрачиваемое время).
Допустим, dataSetI
есть [3, 45, 7, 2]
и dataSetII
есть [2, 54, 13, 15]
. Длина списков всегда одинакова.
Конечно, косинусное сходство находится между 0 и 1 , и для этого оно будет округлено до третьего или четвертого десятичного знака с format(round(cosine, 3))
.
Заранее большое спасибо за помощь.
python
python-3.x
cosine-similarity
Роб Алсод
источник
источник
Ответы:
Вам следует попробовать SciPy . В нем есть множество полезных научных процедур, например, «процедуры для численного вычисления интегралов, решения дифференциальных уравнений, оптимизации и разреженных матриц». Он использует сверхбыстрый оптимизированный NumPy для обработки чисел. Смотрите здесь для установки.
Обратите внимание, что space.distance.cosine вычисляет расстояние , а не сходство. Итак, вы должны вычесть значение из 1, чтобы получить сходство .
источник
другая версия, основанная
numpy
только наисточник
np.inner(a, b) / (norm(a) * norm(b))
, лучше понять.dot
можно получить тот же результат, что иinner
для векторов.scipy.spatial.distance.cosine
.cos_sim = (a @ b.T) / (norm(a)*norm(b))
Вы можете использовать документы
cosine_similarity
функциональной формыsklearn.metrics.pairwise
источник
cosine_similarity([[1, 0, -1]], [[-1,-1, 0]])
Я не думаю, что производительность здесь имеет большое значение, но я не могу сопротивляться. Функция zip () полностью копирует оба вектора (фактически, это больше похоже на транспонирование матрицы) просто для того, чтобы получить данные в «питоническом» порядке. Было бы интересно приурочить реализацию по мелочам:
Это проходит через C-подобный шум извлечения элементов по одному, но не выполняет массовое копирование массива и выполняет все важное за один цикл for и использует единственный квадратный корень.
ETA: обновлен вызов печати - теперь он является функцией. (Первоначально был Python 2.7, а не 3.3. Текущая версия работает под Python 2.7 с
from __future__ import print_function
оператором.) В любом случае результат будет таким же.CPYthon 2.7.3 на 3,0 ГГц Core 2 Duo:
Таким образом, непифонный способ в этом случае примерно в 3,6 раза быстрее.
источник
cosine_measure
в этом случае?cosine_measure
иcosine_similarity
просто разные реализации одного и того же вычисления. Эквивалентно масштабированию обоих входных массивов до «единичных векторов» и взятию скалярного произведения.cosine_measure
это код, опубликованный ранее pkacprzak. Этот код был альтернативой «другому» полностью стандартному решению Python.без использования импорта
можно заменить на
без использования numpy.dot () вам нужно создать свою собственную точечную функцию, используя понимание списка:
а затем просто применить формулу косинусного подобия:
источник
Я провел тест, основанный на нескольких ответах на вопрос, и следующий фрагмент считается лучшим выбором:
Результат меня удивляет, что реализация на его основе
scipy
не самая быстрая. Я профилировал и обнаружил, что косинус в scipy занимает много времени, чтобы преобразовать вектор из списка python в массив numpy.источник
После вычисления можно округлить:
Если вы хотите, чтобы он был действительно коротким, вы можете использовать этот однострочник:
источник
[2,3,2,5]
и v2[3,2,2,0]
. Он возвращается1.0
, как если бы они были точно такими же. Есть идеи, что не так?Вы можете сделать это в Python, используя простую функцию:
источник
Используя numpy, сравните один список чисел с несколькими списками (матрицей):
источник
Вы можете использовать эту простую функцию для вычисления косинусного подобия:
источник
Если вы уже используете PyTorch , вам следует использовать их реализацию CosineSimilarity. .
Предположим, у вас есть
n
двумерныеnumpy.ndarray
s,v1
иv2
, т.е. их формы обе(n,)
. Вот как можно получить их косинусное сходство:Или предположим, что у вас есть два
numpy.ndarray
sw1
иw2
, формы которых совпадают(m, n)
. Следующее дает вам список косинусных сходств, каждое из которых является косинусным сходством между строкой вw1
и соответствующей строкой вw2
:источник
Все ответы отлично подходят для ситуаций, когда вы не можете использовать NumPy. Если можете, вот еще один подход:
Также не забывайте о
EPSILON = 1e-07
безопасном разделении.источник