关于余弦定理

计算公式

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


cosθ=a2+b2−c22ab


对于二维向量有:



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)))

延伸阅读