itemCF的原理
- “我喜欢看《笑傲江湖》”和”我没看过《鹿鼎记》“是会被系统记录下来的
- 推荐系统需要算法来得知《笑傲江湖》与《鹿鼎记》的相似度
- 可以从用户之间的行为挖掘出物品之间的相似性,再利用物品相似性做推荐
ItemCF的实现
- 用户对物品的兴趣是可以量化的:比如点击,点赞,推荐和收藏等
- Item是用户没有见过的物品,我们要决定是否把这个物品推荐给用户
物品相似度
-
两个物品的受众重合度越高,两个物品越相似
- 喜欢射雕英雄传和神雕侠侣的读者的重合度很高
- 可以认为射雕英雄传和神雕侠侣相似
-
如何判断不相似:受众不重合,如下图
-
两个物品相似,两个物品的受众重合很高,如下图
-
计算物品相似度:没有应用到喜欢的程度,只要是喜欢就算为1
-
考虑了喜欢的程度:余弦相似度,夹角越小,两个就越相似,数值介于0到1之间
-
ItemCF的基本思想:如果用户喜欢item1,而且item1和item2相似,那么用户可能喜欢item2
-
预估用户对候选物品的兴趣:需要计算用户对每个物品的兴趣和该物品对其他物品的相似度
-
用户对物品 j 感兴趣,兴趣传递到候选物品上。把这些物品的从已知喜爱程度和到物品与物品相似度之间的路径都加起来,就是总的兴趣
-
要做到这样,我们就需要:
- 把每个物品表示为一个稀疏向量,向量每个元素对应一个用户
- 相似度sim就是两个向量夹角的余弦
ItemCF的完整流程
事先做离线计算
- 建立用户->物品的索引
- 记录每个用户最近点击,交互过的物品ID
- 给定任意用户ID,可以找到他近期感兴趣的物品列表。
- 建立物品->物品的索引
- 计算物品之间两两相似度
- 对于每个物品,索引它最近的K个物品
- 给定任意物品ID,可以快速找到它最相似的k个物品,而且知道相似度分数
- 如下图,用户→物品的索引:每个用户都有一个列表
- 如下图,物品→物品的索引
线上做召回
- 给定用户ID,通过用户->物品索引,找到用户近期感兴趣的物品列表(last-n)
- 对于last-n列表中每个物品,通过 物品->物品索引,找到top-k相似物品,一共取回 n × k 个物品
- 对于取回的相似物品(最多有 n × k )个,用公式预估用户对物品的感兴趣分数
- 返回分数最高的100个物品,作为推荐结果
- 索引的意义在于避免枚举所有物品:如果挨个用公式计算用户对所有物品的兴趣分数,那么计算量会爆
- 记录用户感兴趣的n=200个物品
- 取回每个物品最相似的k=10个物品
- 给取回的nk=2000个物品打分
- 返回分数最高的100个物品作为ItemCF通道的输出
- 用索引,离线计算量大(需要更新两个索引),线上计算量小(只需要给2000个物品打分,不需要访问上亿个物品)
- 线上做召回图示如下: