推荐系统中相似度的作用
- 基于用户、基于物品的协同过滤,往往需要首先计算用户相似度和物品相似度。
根据相似度和用户物品的评分来预测用户对未发生行为的物品的评分。
-
基于内容的召回推荐,往往需要计算物品向量(例如词嵌入向量)的相似度。该相似度也可用于“猜你喜欢”功能。
欧氏距离
欧氏距离,是一个欧式空间下度量距离的方法. 两个物体, 都在同一个空间下表示为两个点, 假如叫做p,q, 分别都是n个坐标, 那么欧式距离就是衡量这两个点之间的距离. 欧氏距离不适用于布尔向量之间
E(p, q)=\sqrt{\sum_{i=1}^{n}\left(p_{i}-q_{i}\right)^{2}}
欧氏距离的值是一个非负数, 最大值正无穷, 通常计算相似度的结果希望是[-1,1]或[0,1]之间,一般可以使用
\frac{1}{1+E(p, q)}
余弦相似度
余弦相似度是,度量的是两个向量之间的夹角, 用夹角的余弦值来度量相似的情况
- 两个向量的夹角为0是,余弦值为1, 当夹角为90度是余弦值为0,为180度是余弦值为-1
- 余弦相似度在度量文本相似度, 用户相似度 物品相似度的时候较为常用
- 余弦相似度的特点, 与向量长度无关,余弦相似度计算要对向量长度归一化, 两个向量只要方向一致,无论程度强弱, 都可以视为相似
\operatorname{sim}(a, b)=\cos (\vec{a}, \vec{b})=\frac{\vec{a} \cdot \vec{b}}{|\vec{a}|*|\vec{b}|}
皮尔逊相关系数Pearson
皮尔逊相关系数,实际上也是余弦相似度, 不过先对向量做了中心化, 向量a b各自减去向量的均值后, 再计算余弦相似度
- 皮尔逊相似度计算结果在-1,1之间 -1表示负相关, 1表示正相关
- 度量两个变量是不是同增同减
- 皮尔逊相关系数度量的是两个变量的变化趋势是否一致, 不适合计算布尔值向量之间的相关度
\operatorname{corr}(a, b)=\frac{\sum_{i}\left(r_{u}-\overline{r}_{a}\right)\left(r_{b}-\overline{r}_{b}\right)}{\sqrt{\sum_{i}\left(r_{a i}-\overline{r}_{a}\right)^{2} \sum_{i}\left(r_{b i}-\overline{r}_{b}\right)^{2}}}=\frac{m \sum a_{i} b_{i}-\sum a_{i} \sum b_{i}}{\sqrt{m} \sum^{2} a_{i}^{2}-\left(\sum a_{i}\right)^{2}} \sqrt{m \sum b_{i}^{2}-\left(\sum b_{i}\right)^{2}}
杰卡德相似度 Jaccard
杰卡德相似度,计算两个集合的交集元素个数在并集中所占的比例, 非常适用于布尔向量(0 1)表示
- 分子是两个布尔向量做点积计算, 得到的就是交集元素的个数
- 分母是两个布尔向量做或运算, 再求元素和
- 向量(0 1 0 0 0 0 0.5 0 0 1)
- 向量(0 1 0 0 0.5 0 1 0 1 0)
\operatorname{sim}(a, b)=\frac{(1+1)}{(1+1+1)+(1+1+1+1)-(1+1)}
tip:余弦相似度和杰卡德相似度对比
- 余弦相似度/皮尔逊相关系数适合用户评分数据(实数值)。
- 杰卡德相似度适用于隐式反馈数据(0,1布尔值 是否收藏,是否点击,是否加购物车)。
api
1 2 3 4 5 6 7 |
# df为用户-物品 点击矩阵 ,用户为行索引,物品为列索引。 from sklearn.metrics.pairwise import pairwise_distances # 计算用户间相似度,返回相似度矩阵 user_similar = 1 - pairwise_distances(df, metric="jaccard") # 计算物品间相似度,返回相似度矩阵 item_similar = 1 - pairwise_distances(df.T, metric="jaccard") |