算法-余弦定理与相关性比较

本文介绍余弦定理的基本概念及其在计算向量相似度的应用,包括二维和三维空间中向量夹角的计算公式,并通过Python代码示例展示了如何计算向量间的相似度。此外还探讨了该方法在新闻和图像相似性识别中的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于余弦定理

计算公式

余弦定理是中学时代比较常见的数学公式之一。从几何学的角度上,cosθ表示了两个向量的比值。实际上可以用来对向量的“相似度”进行描述。
以下展现了二维、三维空间(平面、立体几何)中两个向量(夹角θ)的cosθ计算过程。

cosθ=a2+b2c22ab

对于二维向量有:
cosθ=x1x2+y1y2(x21+y21)(x22+y22)

对于三维向量有:
cosθ=x1x2+y1y2+z1z2(x21+y21+z21)(x22+y22+z22)

由上可知,比较两个n维向量的相似度可转换为求这两个向量的cosθ。
若两个向量完全一致,则cosθ结果为1;若高度相似,则结果接近于1;若结果越小,则越不相关。

代码实现

如下为采用python实现向量空间并计算cos(相关性)值的代码样例。

class VectorCompare:
    # 计算矢量大小
    def magnitude(self,concordance):
        total = 0
        for word, count in concordance.iteritems():
            total += count ** 2
        return math.sqrt(total)

    # 计算矢量之间的 cos 值
    def relation(self, concord1, concord2):
        # relevance = 0
        topvalue = 0
        for word, count in concord1.iteritems():
            if concord2.has_key(word):
                topvalue += count * concord2[word]
        return topvalue / (self.magnitude(concord1) * self.magnitude(concord2))

使用“向量空间搜索引擎”来做相似度识别,具有很多优点:
- 不需要大量的训练迭代
- 不会训练过度
- 可以随时加入/移除错误的数据查看效果,对于无法识别的东西只要加入到搜索引擎中,马上就能识别了
- 很容易理解和编写成代码
- 提供分级结果,可以查看最接近的多个匹配
其缺点是,分类的速度比神经网络慢很多,它不能找到自己的方法解决问题等等。

应用

计算两则新闻的相似度

对于来源于网页的新闻,在经过去除html标签、提取原文、语句分词、词频统计等处理步骤后,可得到一组高频关键词及其各自出现次数的数据。据此排序后,得到两则待比较的新闻的特征向量。
当两个向量越接近,则其夹角越小。当两条新闻向量夹角的余弦等于一时,这两条新闻完全重复(用这个办法可以删除重复的网页);当夹角的余弦接近于一时,两条新闻相似,从而可以归成一类;夹角的余弦越小,两条新闻越不相关。

计算图片的相似性

一般来说,首先想办法将两个图片矢量化,然后进行比较。在矢量化之前,需要对图像进行处理,例如:抽取固定颜色、位置的像素,转换为位图格式(黑白两色)。
如下给出了一个将图片矢量化的方法示例:

def buildvector(im):
    d = {}
    cnt = 0
    for i in im.getdata():
        d[cnt] = i
        cnt += 1
    return d

temp = buildvector(Image.open("./.../%s" %(img_file)))

延伸阅读

余弦定理相似度计算法是一种常用的文本相似度计算方法,用于度量两个文本向量之间的夹角余弦值,从而判断它们的相似程度。该算法基于向量空间模型(VSM),将文本转化为向量表示,并通过计算向量之间的余弦相似度,来衡量文本之间的相似度。 具体来说,对于两个文本$A$和$B$,可以将它们表示为向量$\vec{a}$和$\vec{b}$,每个维度表示对应词汇在文本中出现的次数或权重。例如,假设文本$A$和$B$中包含的词汇集合为$V=\{w_1, w_2, ..., w_n\}$,则可以将它们表示为一个$n$维向量,每个维度表示对应词汇在文本中出现的次数或权重。例如,对于文本$A$和$B$,分别表示为向量$\vec{a}=(a_1, a_2, ..., a_n)$和$\vec{b}=(b_1, b_2, ..., b_n)$,其中$a_i$和$b_i$表示词汇$w_i$在文本$A$和$B$中出现的次数或权重。 然后,通过计算向量$\vec{a}$和$\vec{b}$之间的余弦相似度,来衡量文本$A$和$B$之间的相似度。余弦相似度的计算公式如下: $$\cos(\theta)=\frac{\vec{a}\cdot\vec{b}}{\|\vec{a}\|\|\vec{b}\|}$$ 其中,$\vec{a}\cdot\vec{b}$表示向量$\vec{a}$和$\vec{b}$的点积,$\|\vec{a}\|$和$\|\vec{b}\|$分别表示向量$\vec{a}$和$\vec{b}$的模长,$\theta$表示向量$\vec{a}$和$\vec{b}$之间的夹角。 余弦相似度的取值范围在$[-1, 1]$之间,当$\cos(\theta)=1$时,表示两个向量夹角为0度,即完全相似;当$\cos(\theta)=-1$时,表示两个向量夹角为180度,即完全不相似;当$\cos(\theta)=0$时,表示两个向量夹角为90度,即没有相关性余弦定理相似度计算法的优点是简单易懂,适用于处理各种类型的文本数据,缺点是没有考虑词汇之间的语义关系,对于一些语义相似但表现形式不同的文本,可能会出现误判的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pierre_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值