余弦相似度_公式及推导_案例

定义

余弦相似度通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为0到1之间。
注意这上下界对任何维度的向量空间中都适用,而且余弦相似性最常用于高维正空间。例如在信息检索中,每个词项被赋予不同的维度,而一个维度由一个向量表示,其各个维度上的值对应于该词项在文档中出现的频率。余弦相似度因此可以给出两篇文档在其主题方面的相似度。
另外,它通常用于文本挖掘中的文件比较。此外,在数据挖掘领域中,会用到它来度量集群内部的凝聚力。

两个向量间的余弦值可以通过使用欧几里得点积公式求出:
在这里插入图片描述
给定两个属性向量,A和B,其余弦相似性θ由点积和向量长度给出,如下所示:
在这里插入图片描述
这里的Ai、Bi分别代表向量A和B的各分量。

公式推导

如果对于上述的公式不是很理解,那就请看这里的公式推导:
(由于不会键盘敲数轴和公式,就直接上笔了)
在这里插入图片描述

案例

看一个案例来

当然可以!我们来**深入、系统、直观地讲解“点积”(又称内积、数量积)公式**,包括它的定义、几何意义、代数计算方式、代码实现以及在编程和数学中的广泛应用。 --- ## 🌟 什么是点积(内积)? > **点积(Dot Product)是两个向量之间的一种乘法运算,结果是一个标量(数值),而不是向量。** 它既可以按**代数方式**计算,也可以从**几何角度**理解。 --- ## 一、点积的两种定义 ### ✅ 1. 代数定义(坐标形式) 对于两个 $ n $ 维向量: $$ \vec{a} = [a_1, a_2, \dots, a_n], \quad \vec{b} = [b_1, b_2, \dots, b_n] $$ 它们的点积为: $$ \vec{a} \cdot \vec{b} = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n = \sum_{i=1}^{n} a_i b_i $$ 📌 示例(二维): - $ \vec{a} = [2, 3] $ - $ \vec{b} = [4, -1] $ - $ \vec{a} \cdot \vec{b} = 2 \times 4 + 3 \times (-1) = 8 - 3 = 5 $ --- ### ✅ 2. 几何定义(方向与夹角) $$ \vec{a} \cdot \vec{b} = \|\vec{a}\| \|\vec{b}\| \cos\theta $$ 其中: - $ \|\vec{a}\| $:向量 $ \vec{a} $ 的长度(模) - $ \|\vec{b}\| $:向量 $ \vec{b} $ 的长度 - $ \theta $:两向量之间的夹角($ 0^\circ \leq \theta \leq 180^\circ $) 👉 这个公式揭示了点积的**物理意义**: > “一个向量在另一个向量方向上的投影 × 另一个向量的长度” --- ## 🔗 为什么这两个定义等价? 因为你可以通过余弦定理推导出代数表达式等于几何表达式。 简要思路如下(以二维为例): 设两点 $ A, B $ 对应向量 $ \vec{a}, \vec{b} $,则距离平方为: $$ \|\vec{a} - \vec{b}\|^2 = \|\vec{a}\|^2 + \|\vec{b}\|^2 - 2\|\vec{a}\|\|\vec{b}\|\cos\theta $$ 同时展开左边得: $$ (\vec{a} - \vec{b}) \cdot (\vec{a} - \vec{b}) = \vec{a}\cdot\vec{a} + \vec{b}\cdot\vec{b} - 2\vec{a}\cdot\vec{b} $$ 对比可得: $$ \vec{a} \cdot \vec{b} = \|\vec{a}\| \|\vec{b}\| \cos\theta $$ ✅ 所以两种定义一致! --- ## 二、点积的重要性质 | 性质 | 描述 | |------|------| | 🔄 交换律 | $ \vec{a} \cdot \vec{b} = \vec{b} \cdot \vec{a} $ | | 🔢 分配律 | $ \vec{a} \cdot (\vec{b} + \vec{c}) = \vec{a}\cdot\vec{b} + \vec{a}\cdot\vec{c} $ | | ⬆️ 数乘 | $ (k\vec{a}) \cdot \vec{b} = k(\vec{a} \cdot \vec{b}) $ | | 📏 模长关系 | $ \vec{a} \cdot \vec{a} = \|\vec{a}\|^2 $ | | ⊥ 垂直判断 | $ \vec{a} \perp \vec{b} \iff \vec{a} \cdot \vec{b} = 0 $ | 📌 特别重要:**两个向量垂直 ⇔ 点积为零** --- ## 三、Python 实现点积计算 ### 方法1:手动实现(列表) ```python def dot_product(a, b): if len(a) != len(b): raise ValueError("向量维度必须相同") return sum(ai * bi for ai, bi in zip(a, b)) # 示例 v1 = [2, 3] v2 = [4, -1] print("点积 =", dot_product(v1, v2)) # 输出:5 ``` ### 方法2:使用 NumPy(推荐) ```python import numpy as np a = np.array([2, 3]) b = np.array([4, -1]) dot = np.dot(a, b) # 或者:a @ b (矩阵乘法语法) print("点积 =", dot) # 输出:5 ``` --- ## 四、经典应用案例 ### ✅ 应用1:判断两个向量是否垂直 ```python v1 = [1, 2] v2 = [-4, 2] if np.dot(v1, v2) == 0: print("这两个向量垂直!") else: print("不垂直") # 计算:1*(-4) + 2*2 = -4 + 4 = 0 → 垂直! ``` --- ### ✅ 应用2:求两个向量的夹角(前面讲过) 结合点积公式: $$ \theta = \arccos\left( \frac{\vec{a} \cdot \vec{b}}{\|\vec{a}\| \|\vec{b}\|} \right) $$ ```python def angle_between(a, b): a, b = np.array(a), np.array(b) cos_theta = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) cos_theta = np.clip(cos_theta, -1.0, 1.0) # 防止浮点误差 return np.degrees(np.arccos(cos_theta)) print("夹角 =", angle_between([1, 0], [1, 1])) # 输出:45.0° ``` --- ### ✅ 应用3:投影计算(工程/物理常用) 向量 $ \vec{a} $ 在 $ \vec{b} $ 方向上的**投影长度**为: $$ \text{proj}_{\vec{b}} \vec{a} = \frac{\vec{a} \cdot \vec{b}}{\|\vec{b}\|} $$ 如果要求**投影向量**: $$ \vec{p} = \left( \frac{\vec{a} \cdot \vec{b}}{\|\vec{b}\|^2} \right) \vec{b} $$ ```python def project_vector(a, b): b = np.array(b) scalar = np.dot(a, b) / np.dot(b, b) return scalar * b a = [3, 4] b = [1, 0] proj = project_vector(a, b) print("a 在 b 上的投影向量 =", proj) # [3, 0] ``` --- ### ✅ 应用4:机器学习中相似度衡量(余弦相似度) 在 NLP 或推荐系统中,常用**余弦相似度**衡量两个向量的方向一致性: $$ \text{similarity} = \frac{\vec{a} \cdot \vec{b}}{\|\vec{a}\| \|\vec{b}\|} $$ 这其实就是 $ \cos\theta $! ```python from sklearn.metrics.pairwise import cosine_similarity import numpy as np a = np.array([[1, 2]]) b = np.array([[2, 3]]) sim = cosine_similarity(a, b) print("余弦相似度 =", sim[0][0]) # 接近1表示方向相近 ``` --- ## 五、可视化理解点积 想象你用手电筒照一个物体: - 光线方向是 $ \vec{a} $ - 物体表面法向量是 $ \vec{b} $ - 接收到的光照强度 ∝ $ \vec{a} \cdot \vec{b} $ 当两者同向时最亮,垂直时光照为0。 这就是图形学中光照模型的基础! --- ### ✅ 总结:点积的核心思想 > 点积不是普通的乘法,而是**衡量两个向量“协同程度”的工具**: - 结果 > 0:方向大致相同 - 结果 = 0:正交(垂直) - 结果 < 0:方向相反 它是连接**代数与几何**的桥梁,在人工智能、物理模拟、游戏开发、数据分析等领域无处不在。 记住这个万能公式: $$ \boxed{\vec{a} \cdot \vec{b} = \|\vec{a}\| \|\vec{b}\| \cos\theta} $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值