1.余弦相似度
同过两个向量的夹角的余弦值来判断两个向量的相似度。
余弦值取值[-1,1],越接近1,两向量夹角越小,越相似。
图片.png
二维公式:
图片.png
n维公式:
图片.png
存在的问题[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,相似度为负值,显然更加符合现实。
修正的余弦相似度可以说就是对余弦相似度进行归一化处理的算法,公式如下:
图片.png
2.欧几里得距离
通过两个点(向量)的欧式空间距离来判断相似度
图片.png
标准化欧式距离公式:
图片.png
python实现
余弦相似度使用scipy.spatial.distance.cosine(u,v)
需要注意的是这里公式有所变动:
图片.png
这样取值就在[0,2]。
欧式距离scipy.spatial.distance.euclidean(u,v)