引言
余弦相似度有多种实际应用,通过使用嵌入向量,我们可以以编程方式比较现实世界的含义。Python 是数据科学中最流行的语言之一,它提供了各种库来轻松计算余弦相似度。在本文中,我们将讨论如何在 Scikit-Learn 和 NumPy 库的帮助下在 Python 中实现余弦相似度。
什么是余弦相似度
余弦相似度是衡量 n 维空间中两个非零向量相似度的指标。它用于各种应用,例如文本分析和推荐系统,以确定两个向量在向量空间中的方向的相似度。
余弦相似度公式
两个向量 A 和 B 之间的余弦相似度使用以下公式计算:
(A, B) = (A · B) / (||A|| * ||B||)
在此公式中,A · B 表示向量 A 和 B 的点积。这是通过将两个向量的相应分量相乘并将结果相加来计算的。||A|| 表示向量 A 的欧几里得范数(幅度),即其分量平方和的平方根。计算方式为 ||A|| = √(A₁² + A₂² + … + Aₙ²)。||B|| 表示向量 B 的欧几里得范数(幅度),计算方式与 ||A|| 相同。
如何计算余弦相似度
要计算余弦相似度,首先要完成两个向量点积的计算。然后,将其除以它们幅度的乘积。结果值将在 -1 到 1 的范围内,其中:
如果余弦相似度为 1,则表示向量具有相同的方向并且完全相似。
如果余弦相似度为 0,则表示向量彼此垂直且没有相似性。
如果余弦相似度为 -1,则表示向量具有相反的方向并且完全不相似。
在文本分析中,余弦相似度用于测量文档向量之间的相似度,其中每个文档都表示为高维空间中的向量,每个维度对应于语料库中的术语或单词。通过计算文档向量之间的余弦相似度,您可以确定两个文档彼此之间的相似度或不相似度。
余弦相似度计算库
NumPy:非常适合数值运算,并且针对速度进行了优化。
scikit-learn:提供各种机器学习算法,并在其指标包中包含余弦相似度方法。
以下是一些示例,展示了如何使用 Python 计算余弦相似度。我们将使用两个现在熟悉的书评向量 [5,3,4] 和 [4,2,4]。
直接使用 Python
虽然我们以前是手工计算的,但当然,计算机也可以做到!下面介绍如何使用 Python 计算余弦相似度,无需其他库:
A = [5, 3, 4]
B = [4, 2, 4]
# Calculate dot product
dot_product = sum(a*b for a, b in zip(A, B))
# Calculate the magnitude of each vector
magnitude_A = sum(a*a for a in A)**0.5
magnitude_B = sum(b*b for b in B)**0.5
# Compute cosine similarity
cosine_similarity = dot_product / (magnitude_A * magnitude_B)
print(f"Cosine Similarity using standard Python: {cosine_similarity}")
NumPy
嵌入向量通常具有多个维度 — 数百、数千甚至数百万甚至更多!使用 NumPy,您可以使用高度优化的数组运算来计算余弦相似度。
import numpy as np
A = np.array([5, 3, 4])
B = np.array([4, 2, 4])
dot_product = np.dot(A, B)
magnitude_A = np.linalg.norm(A)
magnitude_B = np.linalg.norm(B)
cosine_similarity = dot_product / (magnitude_A * magnitude_B)
print(f"Cosine Similarity using NumPy: {cosine_similarity}")
Scikit-Learn
Scikit-learn 的 cosine_similarity 函数使得计算高度优化的余弦相似度运算变得更加容易:
from sklearn.metrics.pairwise import cosine_similarity
A = np.array([[5, 3, 4]])
B = np.array([[4, 2, 4]])
cosine_similarity_result = cosine_similarity(A, B)
print(f"Cosine Similarity using scikit-learn: {cosine_similarity_result[0][0]}")
总结
在 Python 中优化余弦相似度计算的技巧
如果您要使用 Python 直接计算余弦相似度,则需要考虑以下几点:
使用优化的库,如 NumPy 或 scikit-learn:这些库针对性能进行了优化,通常比原始 Python 更快。
使用 Numba:Numba 是 Python 和 NumPy 代码的开源 JIT 编译器,专为优化科学计算功能而构建。
使用 GPU:如果您可以使用 GPU,请使用已针对 GPU 使用进行优化的 Python 库(如 TensorFlow)。
并行计算:如果您具有硬件功能,请考虑并行计算以加快速度。