余弦相似度详解及应用案例
余弦相似度详解及应用案例
文章目录
- 余弦相似度详解及应用案例
- 引言
- 余弦相似度基础
- 定义
- 公式
- 基础概念
- 向量与点积
- 模长(欧几里得范数)
- 特点
- 实现示例
- 数据准备
- 步骤1:计算点积
- 步骤2:计算模长
- 步骤3:计算余弦相似度
- Python 实现
- 解释
- 余弦相似度与欧式距离对比
- 欧式距离
- 为什么使用余弦相似度
- 应用场景
- 结论
- 参考文献
引言
在数据分析和机器学习中,衡量不同数据之间的相似性至关重要。一种常用且直观的相似性度量方法是余弦相似度。本文将从余弦相似度的基础概念出发,介绍其计算原理,并通过具体的应用案例加深理解。
重点:【机器学习300问】51、余弦相似度一般用在哪儿?- 小oo呆 - CSDN
余弦相似度基础
定义
余弦相似度是一种用于衡量两个非零向量之间角度的度量方法。它通过计算两个向量夹角的余弦值来评估它们之间的相似性。余弦值越接近1,表示两个向量越相似;越接近0,则表示越不相似。
公式
假设我们有两个非零向量 A \mathbf{A} A 和 B \mathbf{B} B,则它们之间的余弦相似度定义为:
cos ( θ ) = A ⋅ B ∥ A ∥ ∥ B ∥ \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} cos(θ)=∥A∥∥B∥A⋅B
其中,
- A ⋅ B \mathbf{A} \cdot \mathbf{B} A⋅B 表示向量 A \mathbf{A} A 和 B \mathbf{B} B 的点积;
- ∥ A ∥ \|\mathbf{A}\| ∥A∥ 和 ∥ B ∥ \|\mathbf{B}\| ∥B∥ 分别是向量 A \mathbf{A} A 和 B \mathbf{B} B 的模长。
基础概念
向量与点积
在多维空间中,每个数据点都可以表示为一个向量。例如,在二维空间中,向量 v = ( x , y ) \mathbf{v} = (x, y) v=(x,y) 可以表示一个点的位置。在更高维度的空间中,向量可以有更多个分量。
点积(内积) 是两个向量的一种运算,定义为:
A ⋅ B = ∑ i = 1 n a i b i \mathbf{A} \cdot \mathbf{B} = \sum_{i=1}^{n} a_i b_i A⋅B=i=1∑naibi
其中 A = ( a 1 , a 2 , … , a n ) \mathbf{A} = (a_1, a_2, \ldots, a_n) A=(a1,a2,…,an) 和 B = ( b 1 , b 2 , … , b n ) \mathbf{B} = (b_1, b_2, \ldots, b_n) B=(b1,b2,…,bn) 分别是两个向量, n n n 是向量的维度。
模长(欧几里得范数)
向量的模长(也称为欧几里得范数)表示向量的长度,计算公式为:
∥ A ∥ = ∑ i = 1 n a i 2 \|\mathbf{A}\| = \sqrt{\sum_{i=1}^{n} a_i^2} ∥A∥=i=1∑nai2
特点
- 无量纲:余弦相似度是一个无量纲的值,不受向量长度的影响,只关注方向的一致性。
- 范围:余弦相似度的取值范围是 [ − 1 , 1 ] [-1, 1] [−1,1]。当两个向量方向完全相同,即 cos ( θ ) = 1 \cos(\theta) = 1 cos(θ)=1;当方向相反时, cos ( θ ) = − 1 \cos(\theta) = -1 cos(θ)=−1;而当两个向量正交时, cos ( θ ) = 0 \cos(\theta) = 0 cos(θ)=0。
- 计算效率:相较于其他相似度度量方法,如欧几里得距离,余弦相似度在高维空间中更有效率,因为它的计算主要依赖于向量的点积和模长。
实现示例
为了帮助理解余弦相似度的计算过程,我们将通过一个具体的例子来演示。
数据准备
假设我们有两位用户的阅读记录,每位用户都阅读了几本书。我们将使用这些数据来计算这两位用户阅读兴趣的相似度。
设第一位用户的阅读记录向量为 A = ( 1 , 2 , 3 , 0 , 0 ) \mathbf{A} = (1, 2, 3, 0, 0) A=(1,2,3,0,0),第二位用户的阅读记录向量为 B = ( 0 , 3 , 2 , 1 , 1 ) \mathbf{B} = (0, 3, 2, 1, 1) B=(0,3,2,1,1)。这里,向量中的每个元素代表用户对对应书籍的评分,如果用户没有读过某本书,则评分为0。
步骤1:计算点积
点积(内积)是指两个向量对应元素相乘后再求和的结果。对于向量 A \mathbf{A} A 和 B \mathbf{B} B,点积计算如下:
A ⋅ B = ( 1 × 0 ) + ( 2 × 3 ) + ( 3 × 2 ) + ( 0 × 1 ) + ( 0 × 1 ) = 0 + 6 + 6 + 0 + 0 = 12 \mathbf{A} \cdot \mathbf{B} = (1 \times 0) + (2 \times 3) + (3 \times 2) + (0 \times 1) + (0 \times 1) = 0 + 6 + 6 + 0 + 0 = 12 A⋅B=(1×0)+(2×3)+(3×2)+(0×1)+(0×1)=0+6+6+0+0=12
步骤2:计算模长
模长(也称为欧几里得范数)是指向量各元素平方和的平方根。分别计算 A \mathbf{A} A 和 B \mathbf{B} B 的模长:
∥ A ∥ = 1 2 + 2 2 + 3 2 + 0 2 + 0 2 = 1 + 4 + 9 + 0 + 0 = 14 \|\mathbf{A}\| = \sqrt{1^2 + 2^2 + 3^2 + 0^2 + 0^2} = \sqrt{1 + 4 + 9 + 0 + 0} = \sqrt{14} ∥A∥=12+22+32+02+02=1+4+9+0+0=14
∥ B ∥ = 0 2 + 3 2 + 2 2 + 1 2 + 1 2 = 0 + 9 + 4 + 1 + 1 = 15 \|\mathbf{B}\| = \sqrt{0^2 + 3^2 + 2^2 + 1^2 + 1^2} = \sqrt{0 + 9 + 4 + 1 + 1} = \sqrt{15} ∥B∥=02+32+22+12+12=0+9+4+1+1=15
步骤3:计算余弦相似度
根据余弦相似度的公式:
cos ( θ ) = A ⋅ B ∥ A ∥ ∥ B ∥ \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} cos(θ)=∥A∥∥B∥A⋅B
代入上面的值计算得到:
cos ( θ ) = 12 14 × 15 ≈ 0.828079 \cos(\theta) = \frac{12}{\sqrt{14} \times \sqrt{15}} \approx 0.828079 cos(θ)=14×1512≈0.828079
这意味着两位用户的阅读兴趣非常相似,因为余弦相似度接近1。
Python 实现
接下来,我们使用Python来实现上述计算过程。
import numpy as np# 示例向量
vector_a = np.array([1, 2, 3, 0, 0])
vector_b = np.array([0, 3, 2, 1, 1])# 计算点积
dot_product = np.dot(vector_a, vector_b)# 计算模长
norm_a = np.linalg.norm(vector_a)
norm_b = np.linalg.norm(vector_b)# 计算余弦相似度
cosine_similarity = dot_product / (norm_a * norm_b)
print("Cosine similarity:", cosine_similarity)
运行上述代码,您会得到相同的余弦相似度结果,大约为 0.828079。
解释
即使 A \mathbf{A} A 和 B \mathbf{B} B 的模长不同,由于它们的方向相似(大部分元素具有相同的正负号且呈线性关系),余弦相似度接近1,表明两位用户的阅读兴趣相似。
余弦相似度与欧式距离对比
欧式距离
欧式距离是定义在欧式空间中的两点之间的距离,考虑了向量各维度数值上的差异。对于两个点 A \mathbf{A} A 和 B \mathbf{B} B,如果它们在二维空间中的坐标分别是 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 和 ( x 2 , y 2 ) (x_2, y_2) (x2,y2),那么它们之间的欧式距离可以通过下面的公式计算:
d ( A , B ) = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 d(\mathbf{A}, \mathbf{B}) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} d(A,B)=(x2−x1)2+(y2−y1)2
推广到 n n n 维空间中的公式如下:
d ( A , B ) = ∑ i = 1 n ( a i − b i ) 2 d(\mathbf{A}, \mathbf{B}) = \sqrt{\sum_{i=1}^{n} (a_i - b_i)^2} d(A,B)=i=1∑n(ai−bi)2
为什么使用余弦相似度
-
示例说明
- 假设有三本书A、B和C,我们想衡量这三本书的相似程度。基于一些用户的书籍评分数据,我们可以构建特征向量来表示每本书。
- 使用余弦相似度来衡量相似度,因为它关注的是用户对书籍喜好评分的趋势,而不考虑评分的绝对值大小。
-
区别
- 欧式距离体现数值上的绝对差异,而余弦相似度体现方向上的相对差异。
- 当一对文本相似度的长度差距很大、但内容很相近时,如果使用词频统计或词向量作为特征,它们在特征空间中的欧式距离通常很大;而如果使用余弦相似度的话,它们之间的夹角可能很小,因而相似度很高。
应用场景
余弦相似度广泛应用于多个领域,包括但不限于:
- 文本相似性比较:在文本挖掘和自然语言处理中,用于衡量两份文档在主题或内容上的相似程度。
- 推荐系统:通过计算用户向量或其他用户或商品向量的余弦相似度,帮助找到兴趣相似的用户或推荐最匹配的商品。
- 社交网络分析:在社交网络中,计算用户之间的余弦相似度可以发现具有相似兴趣爱好的用户群体或潜在的朋友关系。
- 机器翻译和语义分析:在机器翻译中,计算源语言和目标语言短语或句子的余弦相似度有助于评估翻译结果的质量。
结论
余弦相似度作为一种有效的相似性度量方法,在多个领域都有广泛的应用。通过计算两个向量之间的夹角余弦值,可以有效地评估它们的方向一致性,从而在实际问题中找到相似的数据点或模式。
参考文献
【机器学习300问】51、余弦相似度一般用在哪儿?- 小oo呆 - CSDN
