Skip to content

Cosine Similarity

约 177 个字 30 行代码 预计阅读时间 1 分钟

1. 基本概念

余弦相似度(Cosine Similarity)通过计算两个向量的夹角余弦值来衡量它们的相似性,常用于文本、图像等向量化数据的相似度比较。

核心特点:

  • 范围:[-1, 1](实际场景通常为[0,1])
  • 对向量幅度不敏感(仅考虑方向)
  • 适合高维稀疏数据

2. 计算公式

原始定义

对于向量A和B:
$$
\text{cosine}(A, B) = \frac{A \cdot B}{|A| |B|} = \frac{\sum_{i=1}^n A_i B_i}{\sqrt{\sum_{i=1}^n A_i^2} \sqrt{\sum_{i=1}^n B_i^2}}
$$

标准化版本(向量已单位化)

\[ \text{cosine}(A, B) = A \cdot B \]

3. 计算示例

示例1:简单数值向量

Python
import numpy as np

# 定义两个向量
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])

# 手动计算
dot_product = np.sum(A * B)          # 1*4 + 2*5 + 3*6 = 32
norm_A = np.sqrt(np.sum(A**2))       # sqrt(1+4+9) ≈ 3.7417
norm_B = np.sqrt(np.sum(B**2))       # sqrt(16+25+36) ≈ 8.7750
cos_sim = dot_product / (norm_A * norm_B)  # 32 / (3.7417*8.7750) ≈ 0.9746

# 使用库函数验证
from sklearn.metrics.pairwise import cosine_similarity
cos_sim_lib = cosine_similarity([A], [B])[0][0]  # 输出0.9746

示例二:文本向量(TF-IDF):

Python
from sklearn.feature_extraction.text import TfidfVectorizer

documents = [
    "apple banana fruit",
    "banana orange fruit",
    "car vehicle engine"
]

# 生成TF-IDF向量
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)

# 计算相似度矩阵
cosine_sim_matrix = cosine_similarity(tfidf_matrix)
print(cosine_sim_matrix)