Python 中的余弦相似度

Shivam Arora 2023年1月30日
  1. 使用 scipy 模块计算 Python 中两个列表之间的余弦相似度
  2. 使用 NumPy 模块计算 Python 中两个列表之间的余弦相似度
  3. 使用 sklearn 模块计算 Python 中两个列表之间的余弦相似度
  4. 使用 torch 模块计算 Python 中两个列表之间的余弦相似度
Python 中的余弦相似度

余弦相似度通过计算两个向量列表之间的余弦角来衡量向量列表之间的相似度。如果考虑余弦函数,它在 0 度时的值为 1,在 180 度时为 -1。这意味着对于两个重叠的向量,对于两个完全相反的向量,余弦值将是最大值和最小值。

在本文中,我们将计算两个大小相等的列表之间的余弦相似度。

使用 scipy 模块计算 Python 中两个列表之间的余弦相似度

来自 scipy 模块的 spatial.cosine.distance() 函数计算距离而不是余弦相似度,但为了实现这一点,我们可以从 1 中减去距离的值。

例如,

from scipy import spatial

List1 = [4, 47, 8, 3]
List2 = [3, 52, 12, 16]
result = 1 - spatial.distance.cosine(List1, List2)
print(result)

输出:

0.9720951480078084

使用 NumPy 模块计算 Python 中两个列表之间的余弦相似度

numpy.dot() 函数计算作为参数传递的两个向量的点积。numpy.norm() 函数返回向量范数。

我们可以使用这些函数和正确的公式来计算余弦相似度。

例如,

from numpy import dot
from numpy.linalg import norm

List1 = [4, 47, 8, 3]
List2 = [3, 52, 12, 16]
result = dot(List1, List2) / (norm(List1) * norm(List2))
print(result)

输出:

0.9720951480078084

如果有多个或一组向量和一个查询向量来计算余弦相似度,我们可以使用以下代码。

import numpy as np

List1 = np.array([[4, 45, 8, 4], [2, 23, 6, 4]])

List2 = np.array([2, 54, 13, 15])

similarity_scores = List1.dot(List2) / (
    np.linalg.norm(List1, axis=1) * np.linalg.norm(List2)
)

print(similarity_scores)

输出:

[0.98143311 0.99398975]

使用 sklearn 模块计算 Python 中两个列表之间的余弦相似度

sklearn 模块中,有一个名为 cosine_similarity() 的内置函数来计算余弦相似度。

请参考下面的代码。

from sklearn.metrics.pairwise import cosine_similarity, cosine_distances

A = np.array([10, 3])
B = np.array([8, 7])
result = cosine_similarity(A.reshape(1, -1), B.reshape(1, -1))
print(result)

输出:

[[0.91005765]]

使用 torch 模块计算 Python 中两个列表之间的余弦相似度

当我们处理具有形状 (m,n) 的 N 维张量时,我们可以使用 torch 模块中的 consine_similarity() 函数来查找余弦相似度。

例如,

import torch
import torch.nn.functional as F

t1 = [3, 45, 6, 8]
a = torch.FloatTensor(t1)

t2 = [4, 54, 3, 7]
b = torch.FloatTensor(t2)
result = F.cosine_similarity(a, b, dim=0)

print(result)

输出:

tensor(0.9960)

使用 torch.FloatTensor() 模块将列表转换为张量。

相关文章 - Python Math