关于余弦定理
计算公式
余弦定理是中学时代比较常见的数学公式之一。从几何学的角度上,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)))
延伸阅读
- 关于向量空间搜索引擎的原理
- 利用数学中余弦定理解决相关性比较的问题