余弦相似度公式推导

  • 1. 为什么使用余弦值相似度?
  • 2. 公式推导
    • 2.1 三角函数余弦公式推导
    • 2.2 三角函数向量余弦公式推导
  • 3. 余弦相似度代码实现

1. 为什么使用余弦值相似度?

  • 空间维度上两个点之间相似定义

    • 在空间维度上两个点之间是有夹角和方向,夹角范围在 [0,180]
    • 两个点越相似,方向越接近相同方向,夹角应该越小,越接近0度
    • 两个点意思相反,方向越接近相反方向,夹角应该越大,越接近180度
    • 两个点不相似,方向垂直,夹角应该接近90度
  • 为什么使用余弦值不用正弦值
    • 根据上述相似定义,我们需要找到夹角范围在[0,180]单调性的函数
    • 如下图,正弦值夹角范围在 [0,180],不是单调取值 【不符合】
    • 余弦值夹角范围在 [0,180]具有单调性
      • 夹角为0,应该越相似,夹角值越大(1)
      • 夹角为90,应该无相关性,夹角值为0
      • 夹角为180,应该意思相反,夹角值越小(-1)
  • 总结
    • 余弦单调性符合我们在空间维度位置的关系,所以使用余弦相似度 【自我理解】

2. 公式推导

2.1 三角函数余弦公式推导

c o s ( θ ) = A B 2 + A C 2 − B C 2 2 ∗ A B ∗ A C \begin{aligned} {cos}(\theta)&=\frac{{AB}^{2}+{AC}^{2}-{BC}^{2}}{2*AB*AC} \end{aligned} cos(θ)​=2∗AB∗ACAB2+AC2−BC2​​

  • 余弦公式
    c o s ( θ ) = A D A C \begin{aligned} {cos}(\theta)=\frac{AD}{AC} \end{aligned} cos(θ)=ACAD​​
  • 勾股定理原理可得
    A C 2 = A D 2 + C D 2 ( 1 ) B C 2 = B D 2 + C D 2 ( 2 ) \begin{aligned} {AC}^{2}={AD}^{2}+{CD}^{2}\quad\quad\quad(1)\\ {BC}^{2}={BD}^{2}+{CD}^{2}\quad\quad\quad(2) \end{aligned} AC2=AD2+CD2(1)BC2=BD2+CD2(2)​
  • 公式1-公式2
    A C 2 − B C 2 = A D 2 − B D 2 ( 3 ) \begin{aligned} {AC}^{2}-{BC}^{2}&={AD}^{2}-{BD}^{2}\quad\quad\quad(3)\\ \end{aligned} AC2−BC2​=AD2−BD2(3)​
  • A B , A D , B D AB,AD,BD AB,AD,BD之间的关系, A D AD AD是未知值(但余弦公式需要参数), A B AB AB是已知值,所以得到 B D BD BD相关公式,把 B D BD BD消掉
    A B = A D + B D B D = A B − A D ( 4 ) \begin{aligned} AB&=AD+BD\\ BD&=AB-AD\quad\quad\quad(4) \end{aligned} ABBD​=AD+BD=AB−AD(4)​
  • 公式4带入公式3
    A C 2 − B C 2 = A D 2 − ( A B − A D ) 2 A C 2 − B C 2 = A D 2 − A B 2 + 2 ∗ A B ∗ A D − A D 2 A C 2 − B C 2 = − A B 2 + 2 ∗ A B ∗ A D A D = A B 2 + A C 2 − B C 2 2 ∗ A B ( 5 ) \begin{aligned} {AC}^{2}-{BC}^{2}&={AD}^{2}-{(AB-AD)}^{2}\\ {AC}^{2}-{BC}^{2}&={AD}^{2}-{AB}^{2}+2*AB*AD-{AD}^{2}\\ {AC}^{2}-{BC}^{2}&=-{AB}^{2}+2*AB*AD\\ AD&=\frac{{AB}^{2}+{AC}^{2}-{BC}^{2}}{2*AB}\quad\quad\quad\quad\quad(5) \end{aligned} AC2−BC2AC2−BC2AC2−BC2AD​=AD2−(AB−AD)2=AD2−AB2+2∗AB∗AD−AD2=−AB2+2∗AB∗AD=2∗ABAB2+AC2−BC2​(5)​
  • 公式5带入余弦公式
    c o s ( θ ) = A D A C = A B 2 + A C 2 − B C 2 2 ∗ A B A C = A B 2 + A C 2 − B C 2 2 ∗ A B ∗ A C \begin{aligned} {cos}(\theta)&=\frac{AD}{AC}\\ &=\frac{\frac{{AB}^{2}+{AC}^{2}-{BC}^{2}}{2*AB}}{AC}\\ &=\frac{{AB}^{2}+{AC}^{2}-{BC}^{2}}{2*AB*AC} \end{aligned} cos(θ)​=ACAD​=AC2∗ABAB2+AC2−BC2​​=2∗AB∗ACAB2+AC2−BC2​​

2.2 三角函数向量余弦公式推导

c o s ( θ ) = a ⃗ ∗ b ⃗ ∥ a ∥ ∗ ∥ b ∥ \begin{aligned} {cos}(\theta)&=\frac{\vec{a}*\vec{b}}{\parallel a\parallel*\parallel b\parallel} \end{aligned} cos(θ)​=∥a∥∗∥b∥a ∗b ​​

  • 向量公式
    c ⃗ = a ⃗ − b ⃗ ( 1 ) A C = ∥ b ⃗ ∥ ( 2 ) A B = ∥ a ⃗ ∥ ( 3 ) B C = ∥ c ⃗ ∥ ( 4 ) \begin{aligned} \vec{c}&=\vec{a}-\vec{b}\quad\quad(1)\\ AC &=\parallel \vec{b} \parallel\quad\quad(2)\\ AB &=\parallel \vec{a} \parallel\quad\quad(3)\\ BC &=\parallel \vec{c} \parallel\quad\quad(4)\\ \end{aligned} c ACABBC​=a −b (1)=∥b ∥(2)=∥a ∥(3)=∥c ∥(4)​
  • 公式 1 , 2 , 3 , 4 公式1,2,3,4 公式1,2,3,4带入余弦公式
    c o s ( θ ) = A B 2 + A C 2 − B C 2 2 ∗ A B ∗ A C c o s ( θ ) = ∥ a ⃗ ∥ 2 + ∥ b ⃗ ∥ 2 − ( ∥ a ⃗ − b ⃗ ∥ ) 2 2 ∗ ∥ a ⃗ ∥ ∗ ∥ b ⃗ ∥ c o s ( θ ) = ∥ a ⃗ ∥ 2 + ∥ b ⃗ ∥ 2 − ∥ a ⃗ ∥ 2 + 2 ∗ a ⃗ ∗ b ⃗ − ∥ b ⃗ ∥ 2 2 ∗ ∥ a ⃗ ∥ ∗ ∥ b ⃗ ∥ c o s ( θ ) = a ⃗ ∗ b ⃗ ∥ a ∥ ∗ ∥ b ∥ \begin{aligned} {cos}(\theta)&=\frac{{AB}^{2}+{AC}^{2}-{BC}^{2}}{2*AB*AC}\\ {cos}(\theta)&=\frac{{\parallel \vec{a} \parallel}^{2}+{\parallel \vec{b} \parallel}^{2}-({\parallel\vec{a}-\vec{b}\parallel)}^{2}}{2*\parallel \vec{a} \parallel*\parallel \vec{b} \parallel}\\ {cos}(\theta)&=\frac{{\parallel \vec{a} \parallel}^{2}+{\parallel \vec{b} \parallel}^{2}-{\parallel \vec{a} \parallel}^{2}+2*\vec{a}*\vec{b}-{\parallel \vec{b} \parallel}^{2}}{2*\parallel \vec{a} \parallel*\parallel \vec{b} \parallel}\\ {cos}(\theta)&=\frac{\vec{a}*\vec{b}}{\parallel a\parallel*\parallel b\parallel} \end{aligned} cos(θ)cos(θ)cos(θ)cos(θ)​=2∗AB∗ACAB2+AC2−BC2​=2∗∥a ∥∗∥b ∥∥a ∥2+∥b ∥2−(∥a −b ∥)2​=2∗∥a ∥∗∥b ∥∥a ∥2+∥b ∥2−∥a ∥2+2∗a ∗b −∥b ∥2​=∥a∥∗∥b∥a ∗b ​​

3. 余弦相似度代码实现

  • 代码来自于书籍:深度学习进阶:自然语言处理

    import numpy as npdef preprocess(text):"""语料库预处理:param text:句子字符串:return:corpus 是单词ID 列表word_to_id:是单词到单词 ID 的字典id_to_word 是单词 ID 到单词的字典"""text = text.lower().replace('.', ' .') # 单词全为小写words = text.split(' ') # 以空格分隔word_to_id = {}id_to_word = {}for word in words:if word not in word_to_id:new_id = len(word_to_id)word_to_id[word] = new_idid_to_word[new_id] = wordcorpus = np.array([word_to_id[w] for w in words])return corpus, word_to_id, id_to_word
    def create_co_matrix(corpus, vocab_size, window_size=1):"""语料库生成共现矩阵:param corpus:corpus 是单词 ID 列表:param vocab_size:词汇个数:param window_size:窗口大小:return:共现矩阵"""corpus_size = len(corpus)co_matrix = np.zeros((vocab_size, vocab_size), dtype=np.int32)for idx, word_id in enumerate(corpus):for i in range(1, window_size + 1):left_idx = idx - iright_idx = idx + iif left_idx >= 0:left_word_id = corpus[left_idx]co_matrix[word_id, left_word_id] += 1if right_idx < corpus_size:right_word_id = corpus[right_idx]co_matrix[word_id, right_word_id] += 1return co_matrix
    def cos_similarity(x, y, eps=1e-8):"""余弦相似度函数:param x:x坐标值:param y:y坐标值:param eps:默认值为1e-8,防止分母为0:return:余弦相似度值"""nx = x / (np.sqrt(np.sum(x ** 2)) + eps)ny = y / (np.sqrt(np.sum(y ** 2)) + eps)return np.dot(nx, ny)
    text = 'I say hello and You say goodbye.'
    corpus, word_to_id, id_to_word = preprocess(text)
    print("corpus为:",corpus)
    print("word_to_id为:",word_to_id)
    print("id_to_word为:",id_to_word)
    vocab_size=len(set(corpus))
    C=create_co_matrix(corpus, vocab_size, window_size=1)
    print("共现矩阵为:",C)
    c0 = C[word_to_id['you']] # you的单词向量
    c1 = C[word_to_id['i']] # i的单词向量
    print('you和i的相似度为',cos_similarity(c0, c1))

余弦相似度公式推导及代码实现相关推荐

  1. 欧式距离、曼哈顿距离、余弦相似度(python代码)

    欧式距离/欧几里得度量(Euclidean Distance) 欧氏距离就是两点之间最短的直线距离. (1)二维空间里A.B两点间的欧式距离: SAB=(xA−xB)2+(yA−yB)2S_{AB}= ...

  2. 文本相似度检测之余弦相似度

    为什么文本也需要余弦相似度 文本的余弦相似度是为了计算文本的相似程度而引入的一种方法,例如我们要比较这样两句话的相似程度: A句子:你笑起来真好看. B句子:你笑起来不好看. 这两句话,看起来很相似了 ...

  3. ML:文本、图像等数值化数据相似度计算之余弦相似度计算三种python代码实现

    ML:文本.图像等数值化数据相似度计算之余弦相似度计算三种python代码实现 目录 相似度计算之余弦相似度计算 输出结果 三种python代码实现

  4. python求反余弦_余弦相似度计算公式:python代码找出相似文章

    余弦相似度计算公式:python代码找出相似文章 用TF-IDF算法可以自动提取关键词.除了找到关键词,怎么找到与原文章相似的其他文章.比如,"百科TA说"在词条最下方,还提供多条 ...

  5. 余弦相似度-C#代码实现

    余弦相似度 代码原文地址 https://blog.csdn.net/liu136313/article/details/47190231 为Java 现改为C# 方便以后使用 余弦相似度的灵感来自于 ...

  6. 欧氏距离、余弦相似度、Jaccard相似度、皮尔逊的Python代码与实例

    首先是一段计算4个相似度的Python代码. 需要注意的是,进行归一化操作后,4个函数取值范围都是0-1,而且都是数值越大表示相似性越高,数值为1代表完全相似. import numpy as npd ...

  7. 使用余弦相似度算法计算文本相似度-数学

    20211201 也就是效果 皮尔逊>余弦>欧式 余弦相似度的局限 皮尔逊的优势,相当于是改进版余弦相似度 欧式与 余弦 欧式侧重于直线距离 归一化之后的欧式和余弦的效果也不同 比如 0, ...

  8. python勾股定理中三个数的关系是、找出三十以内的_从勾股定理到余弦相似度-程序员的数学基础...

    大部分程序员由于理工科的背景,有一些高数.线性代数.概率论与数理统计的数学基础.所以当机器学习的热潮来临的时候,都跃跃欲试,对机器学习的算法以及背后的数学思想有比较强烈的探索欲望. 本文的作者就是其中 ...

  9. 余弦相似度 高维数据_从勾股定理到余弦相似度-程序员的数学基础

    大部分程序员由于理工科的背景,有一些高数.线性代数.概率论与数理统计的数学基础.所以当机器学习的热潮来临的时候,都跃跃欲试,对机器学习的算法以及背后的数学思想有比较强烈的探索欲望. 本文的作者就是其中 ...

最新文章

  1. 修改远程桌面连接3389端口号
  2. Codeforces 41D Pawn 简单dp
  3. Netty基础系列(1) --linux网路I/O模型
  4. vs2013中的error c4996的问题
  5. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
  6. 该工程中的宏被禁止_建筑工程的发包与承包中有哪些行为是禁止的?
  7. 服务器接收消息写日志,在Ubuntu 18.04上配置Rsyslog集中式日志服务器的方法
  8. 圆周率里有每个人的银行卡密码和生日?混知乎的程序员果然都是神一般的存在...
  9. 笛卡尔乘积算法的体现
  10. windows下环境变量配置后没生效,不重启电脑的解决办法
  11. 【yarn】yarn 命令行查看 资源状态
  12. beetl 国内下载量貌似快跟freemaker的差不多了
  13. SQL:postgreSQL借助日期函数Extract按照时间区分查询结果
  14. Atitit 理财之道---支出大骗局分析与防范
  15. java的ui自动化测试框架_UI自动化测试框架
  16. TeleportUltra_1.65_PortableSoft离线浏览利器-扒网页神器
  17. nfc卡模式与标准模式_干货丨NFC最全解析
  18. 结构化设计和模块设计
  19. 【万里征程——Windows App开发】SemanticZoom视图切换
  20. 心脏滴血(CVE-2014-0160)

热门文章

  1. ajax 跨域请求post请求,ajax POST跨域请求完美解决
  2. python爬虫实战之爬取中国农药网
  3. 考研模拟卷与真题复盘(持续更新)
  4. nginx图片文件服务器,nginx 图片链接 文件服务器
  5. js正则匹配小数点后2位_js验证是正数且保留2位有效小数点的正则表达式
  6. RSA加解密、验解签区别
  7. systemctl使用reload及踩坑
  8. 将网页都变成灰色的方法
  9. 一段自己录制的Excel宏代码(画柏拉图)
  10. 行为金融(七):过度自信