看starspace的时候发现它实现了dot和cos两种similarity的度量方式,这里总结一下:
余弦相似度衡量两个向量在方向上的相似性,而不care两个向量的实际长度,A和B的长度即使是一个超级短一个超级长的情况下,二者的余弦相似性也可能为1(即theta=0,此时两个向量重合);存在的问题[1]:
余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感。
比如用户对内容评分,5分制。A和B两个用户对两个商品的评分分别为A:(1,2)和B:(4,5)。我们分别用两种方法计算相似度。使用余弦相似度得出的结果是0.98,看起来两者极为相似,但从评分上看X似乎不喜欢这两个东西,而Y比较喜欢。造成这个现象的原因就在于,余弦相似度没法衡量每个维数值的差异,对数值的不敏感导致了结果的误差。
需要修正这种不合理性,就出现了调整余弦相似度,即所有维度上的数值都减去一个均值。
比如A和B对两部电影评分的均值分别是(1+4)/2=2.5,(2+5)/2=3.5。那么调整后为A和B的评分分别是:(-1.5,-1.5)和(1.5,2.5),再用余弦相似度计算,得到-0.98,相似度为负值,显然更加符合现实。
修正的余弦相似度可以说就是对余弦相似度进行归一化处理的算法,公式如下:
欧几里得相似度:
点积相似度: