什么是余弦相似度?python如何计算余弦相似度?
发布于 作者:苏南大叔 来源:程序如此灵动~

余弦相似度计算,这个是常见人工智能领域计算的基础。比如现在火的一塌糊涂的deepseek
大模型等,这些回答的输出,都是基于(余弦)相似度计算的。找出最相似的问题的答案,输出到终端作为答案。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10
,python@3.12.3
,scikit-learn@1.6.1
。在人工智能领域,任何两个要用来比较的事物,都可以量化为同一维度的向量(矢量),然后通过计算两者的余弦相似性来计算两者的近亲关系。
余弦相似度
余弦相似度(Cosine Similarity)是n维空间中两个n维向量之间角度的余弦。它等于两个向量的点积(向量积)除以两个向量长度(或大小)的乘积。下面的文字来自于百度百科:
"余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为-1到1之间。"
可以想象:在xy
坐标系的二维空间内,两个具有相同起点(原点)的有方向的箭头(没有长度限制),两者之间的角度无限拉扯。重叠的时候,两者“最相似),值为1
。九十度相交的时候,不相似,值为0
。一百八十度相反的时候,特别不相似,值为-1
。这个相似度就在[-1,1]之间无限拉扯。这就是【余弦相似度】的真相。
下面的代码,都是基于sklearn
库的。
sklearn 计算余弦
在Python
中,可以使用多种库来计算余弦相似度。先来测试最常见的sklearn
包。用于计算的矢量的实际载体是两个numpy
数组。代码如下:

0.99的相似度,证明相似度非常高。
关于ndarray
多维变一维的操作,可以参考:
计算余弦相似度矩阵
也可以同时计算多个向量的余弦相似度。代码类似如下:
这样,similarity_matrix
将是一个矩阵,其中similarity_matrix[i, j]
表示向量i
和向量j
之间的余弦相似度。

相关文章:
结语
本文使用scikit-learn
库里面的cosine_similarity()
,来计算余弦相似度。这种方法适用于文本数据的特征向量、文档向量等场景,一般先对文本进行向量化(TF-IDF
或词嵌入),然后计算余弦相似度。很多其它的python
代码包,都可以计算余弦相似度。所以,并不需要拘泥于这一个sklearn
库。
更多苏南大叔的人工智能经验文章,可以参考:


