基于用户行为分析的推荐算法是个性化推荐系统的重要算法,学术界一般将这种类型的算法称为协同过滤算法。
用户行为数据简介
- 用户行为数据在网站上最简单的存在形式就是日志。
- 用户行为分类
- 显性反馈行为包括用户明确表示对物品喜好的行为。
- 隐形反馈行为指的是那些不能明确反应用户喜好的行为。(比如页面浏览行为)
显性反馈数据与隐性反馈数据的比较
显性反馈数据 隐性反馈数据 用户兴趣 明确 不明确 数量 较少 庞大 存储 数据库 分布式文件 实时读取 实时 有延迟 正负反馈 都有 只有正反馈 显性反馈数据和隐性反馈数据实例:
显性反馈 隐性反馈 视频网站 用户对视频的评分 用户观看视频的日志、浏览页面的日志 电子商务网站 用户对商品的评分 购买日志、浏览日志 门户网站 用户对新闻的评分 阅读新闻的日志 音乐网站 用户对音乐/歌手/专辑的评分 听歌的日志 比较有代表性的数据集有下面几个
- 无上下文信息的隐性反馈数据集:每一条行为记录仅仅包含用户ID和物品ID。
- 无上下文信息的显性反馈数据集:每一条记录包含用户ID、物品ID和用户对物品的评分。
- 有上下文信息的隐性反馈数据集:每一条记录包含用户ID、物品ID和用户对物品产生行
- 有上下文信息的显性反馈数据集:每一条记录包含用户ID、物品ID、用户对物品的评分和评分行为发生的时间戳。
用户行为分析
用户活跃度和物品流行度的分布
很多关于互联网数据的研究发现,互联网上的很多数据分布都满足一种称为Power Law的分布,这个分布在互联网领域也称长尾分布。
很多研究人员发现,用户行为数据也蕴含着这种规律。令 fu(k) 为对 k 个物品产生过行为的用户
数,令
用户活跃度和物品流行度的关系
- 用户越活跃,越倾向于浏览冷门的物品
- 仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法,有很多方法
- 基于领域的方法(业界得到最广泛的应用)
- 基于用户的协同过滤算法:这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品。
- 基于物品的协同过滤算法:这种算法给用户推荐和他之前喜欢的物品相似的物品。
- 隐语义模型
- 基于图的随机游走算法
- 基于领域的方法(业界得到最广泛的应用)
基于领域的算法
基于用户的协同过滤算法(UserCF)
- 步骤
- 找到和目标用户兴趣相似的用户集合
- 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户
- 计算两个用户的兴趣相似度
这里,协同过滤算法主要利用行为的相似度计算兴趣的相似度。给定用户
u
和用户
或者通过余弦相似度计算:
- 优化
该代码对两两用户都利用余弦相似度计算相似度。这种方法的时间复杂度是 O(|U|∗|U|) ,这在用户数很大时非常耗时。事实上,很多用户相互之间并没有对同样的物品产生过行为。所以可以先建立物品到用户的倒排表,对于每个物品都保存对该物品产生过行为的用户列表。 计算用户对物品的感兴趣程度
得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的 K 个用户喜欢的物品。如下的公式度量了UserCF算法中用户
u 对物品 i 的感兴趣程度:
p(u,i)=∑v∈S(u,K)∩N(i)wuvrvi 其中, S(u,K) 包含和用户 u 兴趣最接近的
K 个用户, N(i) 是对物品 i 有过行为的用户集合,wuv 是用户 u 和用户v 的兴趣相似度, rvi 代表用户 v 对物品i 的兴趣,因为使用的是单一行为的隐反馈数据,所以所有的 rvi=1 。用户相似度的改进
两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。
wuv=∑i∈N(u)∩N(v)1log1+|N(i)||N(u)||N(v)|−−−−−−−−−−√
可以看到,该公式通过 1log1+|N(i)| 惩罚了用户 u 和用户v 共同兴趣列表中热门物品对他们相似度的影响。
基于物品的协同过滤算法(ItemCF)
- 步骤
- 计算物品之间的相似度。
- 根据物品的相似度和用户的历史行为给用户生成推荐列表。
物品相似度
基本的相似度定义
亚马逊显示相关物品推荐时的标题是“ Customers Who Bought This Item Also Bought ”(购买了该商品的用户也经常购买的其他商品)。从这句话的定义出发,我们可以用下面的公式定义物品的相似度:
wij=|N(i)∩N(j)||N(i)|
这里,分母 |N(i)| 是喜欢物品 i 的用户数,而分子 |N(i)∩N(j)| 是同时喜欢物品 i 和物品j 的用户数。因此,上述公式可以理解为喜欢物品 i 的用户中有多少比例的用户也喜欢物品j 。惩罚热门物品的物品相似度
上述公式虽然看起来很有道理,但是却存在一个问题。如果物品 j 很热门,很多人都喜欢,那么Wij 就会很大,接近1。因此,该公式会造成任何物品都会和热门的物品有很大的相似度,这对于致力于挖掘长尾信息的推荐系统来说显然不是一个好的特性。为了避免推荐出热门的物品,可以用下面的公式:
wij=|N(i)∩N(j)||N(i)||N(j)|−−−−−−−−−−√
这个公式惩罚了物品 j 的权重,因此减轻了热门物品会和很多物品相似的可能性。
用户对物品的兴趣
在得到物品之间的相似度后,ItemCF通过如下公式计算用户 u 对一个物品j 的兴趣:
puj=∑i∈N(u)∩S(j,K)wjirui
这里 N(u) 是用户喜欢的物品的集合, S(j,K) 是和物品 j 最相似的K 个物品的集合, wji 是物品j和i的相似度, rui 是用户 u 对物品i 的兴趣。(对于隐反馈数据集,如果用户 u 对物品i 有过行为,即可令 rui=1 。)该公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名。用户活跃度对物品(ItemCF-IUF)
用户活跃度对数的倒数的参数,活跃用户对物品相似度的贡献应该小于不活跃的用户,应该增加IUF参数来修正物品相似度的计算公式:
wij=∑u∈N(i)∩N(j)1log1+|N(u)||N(i)||N(j)|−−−−−−−−−−√
上面的公式只是对活跃用户做了一种软性的惩罚,但对于很多过于活跃的用户,比如上面那位买了当当网80%图书的用户,为了避免相似度矩阵过于稠密,我们在实际计算中一般直接忽略他的兴趣列表,而不将其纳入到相似度计算的数据集中。- 物品相似度的归一化
如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率。研究表明,如果已经得到了物品相似度矩阵 w ,那么可以用如下公式得到归一化之后的相似度矩阵w′ :
wij=wijmaxjwij
归一化的好处不仅仅在于增加推荐的准确度,它还可以提高推荐的覆盖率和多样性。一般来说,物品总是属于很多不同的类,每一类中的物品联系比较紧密。
UserCF和ItemCF的综合比较
UserCF与ItemCF优缺点对比
UserCF ItemCF 性能 适用于用户较少的场合,如果用户很多,计算用户相似度矩阵代价很大 适用于物品数明显小于用户数的场合,如果物品很多(网页),计算物品相似度矩阵代价很大 领域 时效性较强,用户个性化兴趣不太明显的领域 长尾物品丰富,用户个性化需求强烈的领域 实时性 用户有新行为,不一定造成推荐结果的立即变化 用户有新行为,一定会导致推荐结果的实时变化 冷启动 在新用户对很少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度表是每隔一段时间离线计算的。新物品上线后一段间,一旦有用户对物品产生行为,就可以将新物品推荐给和对它产生行为的用户兴趣相似的其他用户 新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品。但没有办法在不离线更新物品相似度表的情况下将新物品推荐给用户 推荐理由 很难提供令用户信服的推荐解释 利用用户的历史行为给用户做推荐解释,可以令用户比较信服 哈利波特问题
回顾一下ItemCF计算物品相似度的经典公式:
wij=|N(i)∩N(j)||N(i)||N(j)|−−−−−−−−−−√
前面说过,如果 j 非常热门,那么上面公式的分子|N(i)∩N(j)| 就会越来越接近 |N(i)| 。尽管上面的公式分母已经考虑到了 j 的流行度,但在实际应用中,热门的j 仍然会获得比较大的相似度。
最容易想到的,我们可以在分母上加大对热门物品的惩罚,比如采用如下公式:
wij=|N(i)∩N(j)||N(i)|1−α|N(j)|α
其中 α∈[0.5,1] 。通过提高 α ,就可以惩罚热门的 j 。
隐语义模型
基础算法
- 隐语义模型是最近几年推荐系统领域最为热门的研究话题,它的核心思想是通过隐含特征(latent factor)联系用户兴趣和物品。
- 需要解决的问题
- 如何给物品进行分类?
- 找编辑给物品分类(存在很多问题)
- 隐含语义分析技术因为采取基于用户行为统计的自动聚类,较好地解决了编辑分类存在的问题。
- 如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?
- 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?
- 如何给物品进行分类?
- 隐含特征模型(LFM)
- 计算用户对物品的兴趣
Preference(u,i)=rui=pTuqi=∑f=1Fpu,kqi,k
这个公式中 pu,k 和 qi,k 是模型的参数,其中 pu,k 度量了用户 u 的兴趣和第k 个隐类的关系,而 qi,k 度量了第 k 个隐类和物品i 之间的关系。 - 负样本的选择:
- 对每个用户,要保证正负样本的平衡(数目相似)。
- 对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。
- 损失函数
C=∑(u,i)∈K(rui−r^ui)2=∑(u,i)∈K(rui−∑k=1Kpu,kqi,k)2+λ||pu||2+λ||qi||2
这里, λ||pu||2+λ||qi||2 是用来防止过拟合的正则化项,λ可以通过实验获得。要最小化上面的损失函数,可以利用一种称为随机梯度下降法的算法。该算法是最优化理论里最基础的优化算法,它首先通过求参数的偏导数找到最速下降方向,然后通过迭代法不断地优化参数。 LFM和基于领域的方法的比较
- 理论基础:LFM具有比较好的理论基础,它是一种学习方法,通过优化一个设定的指标建立最优的模型。基于邻域的方法更多的是一种基于统计的方法,并没有学习过程。
- 离线计算的空间复杂度:基于邻域的方法需要维护一张离线的相关表。在离线计算相关表的过程中,如果用户/物品数很多,将会占据很大的内存。LFM只需占用很少的内存。
- 离线计算的时间复杂度:总体上来说两者没有太大差别。
- 在线实时推荐:UserCF和ItemCF在线服务算法需要将相关表缓存在内存中,然后可以在线进行实时的预测。LFM在给用户生成推荐列表时,需要计算用户对所有物品的兴趣权重,然后排名,返回权重最大的N个物品。那么,在物品数很多时,这一过程的时间复杂度非常高,LFM不太适合用于物品数非常庞大的系统,也不能实时计算。
- 推荐解释:ItemCF算法支持很好的推荐解释,它可以利用用户的历史行为解释推荐结果。但LFM无法提供这样的解释。
基于图的模型
用户行为数据的二分图表示
![二分图表示](https://github.com/easezyc/easezyc.github.io/tree/master/img/bipartite graph.png)
基于图的推荐算法
- 图中顶点的相关性主要取决于下面三个因素
- 两个顶点之间的路径数;
- 两个顶点之间路径的长度;
- 两个顶点之间的路径经过的顶点。
- 相关性高的一对顶点一般具有如下特征
- 两个顶点之间有很多路径相连;
- 连接两个顶点之间的路径长度都比较短;
- 连接两个顶点之间的路径不会经过出度比较大的顶点。
- PersonalRank算法
假设要给用户 u 进行个性化推荐,可以从用户u 对应的节点 vu 开始在用户物品二分图上进行随机游走。游走到任何一个节点时,首先按照概率 α 决定是继续游走,还是停止这次游走并从vu 节点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数。最终的推荐列表中物品的权重就是物品节点的访问概率。如果将上面的描述表示成公式,可以得到如下公式:
f(x)=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪α∑v′∈in(v)PR(v′)|out(v′)|(1−α)+α∑v′∈in(v)PR(v′)|out(v′)|(v≠vu)(v=vu)
- 计算用户对物品的兴趣