余弦计算相似度度量

相似度度量(Similarity),即计算个体间的相似程度,相似度度量的值越小,说明个体间相似度越小,相似度的值越大说明个体差异越大。

对于多个不同的文本或者短文本对话消息要来计算他们之间的相似度如何,一个好的做法就是将这些文本中词语,映射到向量空间,形成文本中文字和向量数据的映射关系,通过计算几个或者多个不同的向量的差异的大小,来计算文本的相似度。下面介绍一个详细成熟的向量空间余弦相似度方法计算相似度

向量空间余弦相似度(Cosine Similarity)

 

余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。

余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。

 

上图两个向量a,b的夹角很小可以说a向量和b向量有很高的的相似性,极端情况下,a和b向量完全重合。如下图:

如上图二:可以认为a和b向量是相等的,也即a,b向量代表的文本是完全相似的,或者说是相等的。如果a和b向量夹角较大,或者反方向。如下图

如上图三: 两个向量a,b的夹角很大可以说a向量和b向量有很低的的相似性,或者说a和b向量代表的文本基本不相似。那么是否可以用两个向量的夹角大小的函数值来计算个体的相似度呢?

向量空间余弦相似度理论就是基于上述来计算个体相似度的一种方法。下面做详细的推理过程分析。

想到余弦公式,最基本计算方法就是初中的最简单的计算公式,计算夹角

 

图(4)

的余弦定值公式为:

但是这个是只适用于直角三角形的,而在非直角三角形中,余弦定理的公式是

图(5)

三角形中边a和b的夹角 的余弦计算公式为:

公式(2)

在向量表示的三角形中,假设a向量是(x1, y1),b向量是(x2, y2),那么可以将余弦定理改写成下面的形式:

图(6)

向量a和向量b的夹角 的余弦计算如下

 

扩展,如果向量a和b不是二维而是n维,上述余弦的计算法仍然正确。假定a和b是两个n维向量,a是  ,b是  ,则a与b的夹角 的余弦等于:

余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,夹角等于0,即两个向量相等,这就叫"余弦相似性"。

 

 

另外:余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异。

借助三维坐标系来看下欧氏距离和余弦距离的区别:

clip_image009

从上图可以看出,欧氏距离衡量的是空间各点的绝对距离,跟各个点所在的位置坐标直接相关;而余弦距离衡量的是空间向量的夹角,更加体现在方向上的差异,而不是位置。如果保持A点位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦距离 clip_image011 是保持不变的(因为夹角没有发生变化),而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦距离之间的不同之处。

欧氏距离和余弦距离各自有不同的计算方式和衡量特征,因此它们适用于不同的数据分析模型:

欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。

余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。

 

正因为余弦相似度在数值上的不敏感,会导致这样一种情况存在:

 

用户对内容评分,按5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得到的结果是0.98,两者极为相似。但从评分上看X似乎不喜欢2这个 内容,而Y则比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性就出现了调整余弦相似度,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8,相似度为负值并且差异不小,但显然更加符合现实。

那么是否可以在(用户-商品-行为数值)矩阵的基础上使用调整余弦相似度计算呢?从算法原理分析,复杂度虽然增加了,但是应该比普通余弦夹角算法要强。


 

【下面举一个例子,来说明余弦计算文本相似度】

    举一个例子来说明,用上述理论计算文本的相似性。为了简单起见,先从句子着手。

         句子A:这只皮靴号码大了。那只号码合适

句子B:这只皮靴号码不小,那只更合适

怎样计算上面两句话的相似程度?

基本思路是:如果这两句话的用词越相似,它们的内容就应该越相似。因此,可以从词频入手,计算它们的相似程度。

第一步,分词

句子A:这只/皮靴/号码/大了。那只/号码/合适。

句子B:这只/皮靴/号码/不/小,那只/更/合适。

第二步,列出所有的词。

这只,皮靴,号码,大了。那只,合适,不,小,很

第三步,计算词频。

句子A:这只1,皮靴1,号码2,大了1。那只1,合适1,不0,小0,更0

句子B:这只1,皮靴1,号码1,大了0。那只1,合适1,不1,小1,更1

第四步,写出词频向量。

  句子A:(1,1,2,1,1,1,0,0,0)

  句子B:(1,1,1,0,1,1,1,1,1)

到这里,问题就变成了如何计算这两个向量的相似程度。我们可以把它们想象成空间中的两条线段,都是从原点([0, 0, ...])出发,指向不同的方向。两条线段之间形成一个夹角,如果夹角为0度,意味着方向相同、线段重合,这是表示两个向量代表的文本完全相等;如果夹角为90度,意味着形成直角,方向完全不相似;如果夹角为180度,意味着方向正好相反。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。

使用上面的公式(4)

计算两个句子向量

句子A:(1,1,2,1,1,1,0,0,0)

和句子B:(1,1,1,0,1,1,1,1,1)的向量余弦值来确定两个句子的相似度。

计算过程如下:

计算结果中夹角的余弦值为0.81非常接近于1,所以,上面的句子A和句子B是基本相似的

由此,我们就得到了文本相似度计算的处理流程是:

    (1)找出两篇文章的关键词;

 (2)每篇文章各取出若干个关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频

 (3)生成两篇文章各自的词频向量;

 (4)计算两个向量的余弦相似度,值越大就表示越相似。

<think>好的,我现在需要解决用户关于余弦相似度度量函数实现和解释的问题。首先,我得回忆一下余弦相似度的基本概念。根据引用[4]和[5],余弦相似度是通过计算两个向量的夹角的余弦值来衡量它们的相似性,关注的是方向而不是大小。这应该是核心点。 接下来,用户提到想了解具体的实现方法和公式。根据引用[3],余弦相似度的公式是点积除以范数的乘积,也就是cosθ = (A·B)/(||A||*||B||)。我需要详细解释这个公式,确保用户明白每个部分的含义。比如,点积部分如何计算,范数如何求,可能需要举例说明。 然后,用户可能需要代码示例。根据引用[3]中的Java实现,我可以参考类似的逻辑,用Python或者其他常见语言来展示。比如,用Python的numpy库实现,或者纯Python代码。要注意代码的正确性,比如处理零向量的情况,避免除以零的错误。 另外,用户提供的引用中提到余弦相似度的优缺点,比如对数值不敏感的问题,以及调整余弦相似度的解决方法。这些内容也需要在解释中涵盖,帮助用户全面理解适用场景和可能的改进方法。例如,引用[1]中的例子说明为什么需要调整,调整后的计算方式等。 还有,我需要确保回答结构清晰,分点解释,可能包括数学公式、代码实现、应用场景、优缺点和优化方法。引用中的内容要自然地融入解释中,并在适当的位置添加引用标识,比如在讨论优缺点时引用[1],在公式部分引用[3]或[5]。 最后,生成相关问题时要覆盖用户可能感兴趣的扩展方向,比如与其他相似度度量的对比、实际应用案例、优化技巧等。这样可以帮助用户进一步探索相关主题。 现在需要检查是否有遗漏的要点,比如是否解释了调整余弦相似度,是否提供了不同语言的代码示例,是否覆盖了应用场景。同时,要确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,并正确分段。避免语法错误,比如括号闭合是否正确,积分符号的使用是否符合用户示例中的格式。 可能还需要注意用户之前的提问历史,但根据当前信息,用户主要是询问余弦相似度的实现和解释,因此重点应放在这两个方面。同时,引用中的内容需要准确对应,比如引用[1]提到的调整余弦相似度,引用[4]和[5]关于方向性的强调。确保每个引用标识符正确对应来源,避免混淆。 总结一下,回答的结构应该是:定义和公式、代码实现、应用场景、优缺点及改进方法,最后相关问题。每个部分简明扼要,引用正确,代码示例清晰。</think>### 余弦相似度度量函数实现与解释 #### 1. 定义与数学公式 **余弦相似度**用于衡量两个向量在方向上的相似性,计算公式为: $$ \text{cos} \theta = \frac{A \cdot B}{\|A\| \cdot \|B\|} $$ 其中: - $A \cdot B$ 是向量的点积,计算方式为 $\sum_{i=1}^{n} A_i B_i$; - $\|A\|$ 和 $\|B\|$ 是向量的范数(即模长),计算方式为 $\sqrt{\sum_{i=1}^{n} A_i^2}$ [^3][^5]。 **特性**: - 取值范围为 $[-1,1]$,1表示方向完全相同,-1表示完全相反; - **仅关注方向差异,忽略向量长度**,因此适用于文本相似性、推荐系统等场景[^4][^5]。 #### 2. Python代码实现 ```python import numpy as np def cosine_similarity(a, b): dot_product = np.dot(a, b) norm_a = np.linalg.norm(a) norm_b = np.linalg.norm(b) if norm_a == 0 or norm_b == 0: return 0 # 处理零向量情况 return dot_product / (norm_a * norm_b) # 示例 vec1 = np.array([1, 2, 3]) vec2 = np.array([4, 5, 6]) print(cosine_similarity(vec1, vec2)) # 输出约0.974 ``` #### 3. 应用场景 - **自然语言处理**:衡量文本向量的语义相似性; - **推荐系统**:比较用户评分向量,推荐相似商品; - **图像检索**:通过特征向量匹配相似图像[^4][^5]。 #### 4. 优缺点与改进 **局限性**: - 对绝对数值不敏感,可能导致不合理结果。例如用户评分向量 $(1,2)$ 和 $(4,5)$ 余弦相似度为 $0.98$,但实际偏好差异较大[^1]。 **改进方法**:**调整余弦相似度** - 计算前减去维度均值,消除数值偏差: $$ A_{\text{adjusted}} = A - \mu_A, \quad B_{\text{adjusted}} = B - \mu_B $$ 调整后相似度可能更符合实际(如示例中调整后相似度变为 $-0.98$)[^1]。 #### 5. 与其他度量的对比 | 度量方式 | 关注点 | 公式示例 | |------------------|--------------|------------------------------| | 余弦相似度 | 方向相似性 | $\frac{A \cdot B}{\|A\|\|B\|}$ | | 欧氏距离 | 绝对距离 | $\sqrt{\sum (A_i - B_i)^2}$ | | 点积相似度 | 方向+幅度 | $A \cdot B$ |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值