相似度计算之余弦相似度

36 sec read

在推荐系统中常常会计算相似度的问题,其中最常见的是采用余弦相似度的方式进行计算,今天就一起来学习下余弦相似度,搞清楚这样的计算方式更加适合什么样的场景。

余弦相似度

余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为0到1之间。

二维空间为例,上图的a和b是两个向量,我们要计算它们的夹角θ。余弦定理告诉我们,可以用下面的公式求得:

    \[cos\theta = \frac{a^2+b^2-c^2}{2ab}\]

假定a向量是[x1, y1],b向量是[x2, y2],两个向量间的余弦值可以通过使用欧几里得点积公式求出:

向量a和向量b的夹角 的余弦计算如下:

    \[\cos(\theta )={A\cdot B \over \|A\|\|B\|} = \frac{(x_1,y_1)\cdot (x_2,y_2)}{\sqrt{x_1^2+y_1^2}\times{\sqrt{x_2^2+y_2^2}}} = \frac{{x_1}{x_2}+{y_1}{y_2}}{\sqrt{x_1^2+y_1^2}\times{\sqrt{x_2^2+y_2^2}}}\]

如果向量a和b不是二维而是n维,上述余弦的计算法仍然正确。假定A和B是两个n维向量,A是 [A1, A2, …, An] ,B是 [B1, B2, …, Bn] ,则A与B的夹角θ的余弦等于:

    \[\cos(\theta )={A\cdot B \over \|A\|\|B\|}={\frac {\sum \limits _{i=1}^{n}{A_{i}\times B_{i}}}{{\sqrt {\sum \limits _{i=1}^{n}{(A_{i})^{2}}}}\times {\sqrt {\sum \limits _{i=1}^{n}{(B_{i})^{2}}}}}}\]

存在的问题:余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感。比如用户对内容评分,5分制。A和B两个用户对两个商品的评分分别为A:(1,2)和B:(4,5)。我们分别用两种方法计算相似度。使用余弦相似度得出的结果是0.98,看起来两者极为相似,但从评分上看X似乎不喜欢这两个东西,而Y比较喜欢。造成这个现象的原因就在于,余弦相似度没法衡量每个维数值的差异,对数值的不敏感导致了结果的误差。

Python实现

修正余弦相似度

需要修正这种不合理性,就出现了调整余弦相似度,即所有维度上的数值都减去一个均值。

比如A和B对两部电影评分的均值分别是(1+4)/2=2.5,(2+5)/2=3.5。那么调整后为A和B的评分分别是:(-1.5,-1.5)和(1.5,2.5),再用余弦相似度计算,得到-0.98,相似度为负值,显然更加符合现实。

修正的余弦相似度可以说就是对余弦相似度进行归一化处理的算法,公式如下:

    \[s(i, j) = \frac {\sum_{u \in U}(R_{u,i} - R)(R_{u,j} - R)} {   \sqrt{\sum_{u \in U}(R_{u,i} - R_{u})^{2}}   \sqrt{\sum_{u \in U}(R_{u,j} - R_{u})^{2}} }\]

python实现:

欧几里得距离和余弦相似度的区别

直观来说,欧几里得距离衡量空间点的直线距离,余弦距离衡量点在空间的方向差异。

参考链接:

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

K-近邻算法KNN学习笔记

什么是K-近邻算法? K近邻法(k-nearest neighbor, k-NN)是1967年由Cover T
2 min read

使用Prophet进行时间序列预测

Prophet是Facebook开源的预测工具,相比ARIMA模型,Prophet真的是非常的简单。只要读入两
1 min read

采用时间序列预测股价变化

时间序列简介 在数学上,随机过程被定义为一族时间随机变量,即{x(t),t∈T},其中T表示时间t的变动范围。
5 min read

发表评论

电子邮件地址不会被公开。 必填项已用*标注