此文是根据《推荐系统实践》部分整理而来。
PART 1 隐语义模型
隐语义模型核心思想是:通过隐含特征联系用户兴趣和物品。
举一个例子来理解这个模型。用户A的喜欢侦探小说、科普图书以及一些计算机技术书,用户B喜欢数学和机器学习的书。那么如何推荐呢?
- 对于UserCF,首先找到和他们看了同样书的用户,然后推荐那些用户喜欢的其他的书。
- 对于ItemCF,需要给他们推荐和他们已经看过的书相似的书。
还有一种方法,可以对书和物品的兴趣进行分类,对于某个用户,首先得到他的兴趣分类,然后从分类中挑选他可能喜欢的物品。这个基于兴趣分类的方法大概需要解决三个问题: - 如何给物品进行分类?
- 如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?
- 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?
第一个问题解决方法是:找编辑给物品分类。但是缺点有很多:
- 编辑的意见不能代表用户的意见,有些物品的分类是模棱两可的。
- 编辑很难控制分类的粒度。
- 编辑很难给一个物品多个分类。
- 编辑很难给出多维度的分类。比如作者、译者、出版社
- 编辑很难决定一个物品在某一分类中的权重。
为了解决上面的问题,隐含语义分析技术出现了,它采用基于用户行为统计的自动聚类,较好地解决了编辑的问题:
- 隐含语义分析的分类来自用户的统计,代表了用户的看法。
- 隐含语义分析技术允许我们指定最终有多少个分类,数字越大,粒度就越细。
- 隐含语义分析技术给出的每个分类都不是同一个维度的,是基于用户的共同兴趣计算出来的。
- 隐含语义分析技术通过统计用户的行为决定物品在每个类中的权重。
隐含语义分析技术有很多著名的模型和方法:pLSA、LDA、隐含类别模型、隐含主题模型、矩阵分解。本文将以LFM为例介绍隐含语义分析技术在推荐系统中的应用。
LFM通过如下的公式计算用户u对物品i的兴趣:
Paste_Image.png
Pu,k和Qi,k是模型的参数,其中Pu,k度量了用户u的兴趣和第k个隐类的关系,而Qi,k度量了第k个隐类和物品i之间的关系。
要计算这两个参数,需要一个训练集,对于每个用户u,训练集里都包含了用户u喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。
推荐系统的用户行为分为显性反馈和隐性反馈。LFM在显性反馈数据上解决评分预测问题并达到了很好的精度,不过本文主要讨论的是隐性反馈数据集,这种数据集的特点是只有正样本,没有负样本。所以第一个问题就是,如何给每个用户生成负样本。
Rong Pan对比了如下几种方法:
- 对于一个用户,用他所有没有过的行为作为负样本。
- 对于一个用户,从他没有过行为的物品中均匀采样出一些物品作为负样本。
- 对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,但采样时,保证每个用户的正负样本数目相当。
- 对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,但采样时,偏重采样不热门的物品。
对于第1种方法,明显缺点是负样本太多,计算复杂度很高,精度也差。对于另外3种方法,Rong Pan在文章中表示第3种>第2种>第4种。
后来在一个比赛中,发现负样本采样时应该遵循以下原则:
- 对每个用户,要保证正负样本平衡。
- 对每个用户采样负样本时,要选择那些很热门,而用户没有行为的物品。因为很热门而用户没有行为更加代表用户对这个物品不感兴趣,对于冷门的物品,可能用户根本没有发现。(后面具体实现方式就不贴了)
通过离线实验评测LFM的性能,在MovieLens数据集上用LFM计算出用户兴趣向量p和物品向量q,然后对于每个隐类找出权重最大的物品:
Paste_Image.png
如果将LFM的结果与ItemCF和UserCF算法的性能相比,可以发现LFM在所有的指标上都优于UserCF和ItemCF。当数据非常稀疏时,LFM的性能会明显下降。
PART 2 LFM和基于邻域方法的比较
LFM是一种基于机器学习的方法,具有比较好的理论基础。这个方法和基于邻域的方法相比,各有优缺点:
- 理论基础。LFM具有比较好的理论基础,它是一种学习方法,通过优化一个设定的指标建立最优的模型。基于邻域的方法更多是一种基于统计的方法,没有学习过程。
- 离线计算的空间复杂度。基于邻域的方法需要维护一张离线的相关表,如果用户/物品很多,会占据很大的内存,需要O(NN)的空间。而LFM在建模过程中,如果是F个隐类,那么它需要的存储空间是O(F(M+N))),这在M和N很大时可以很好地节省离线计算的内存。用户数40万时,UserCF大概需要30GB内存,LFM只需要4GB内存。
- 离线计算的时间复杂度。假设有M个用户,N个物品,K条用户对物品的行为记录,那么UserCF计算用户相关表的时间复杂度是O(N(K/N)^2);ItemCF计算物品相关表的时间复杂度是O(M(K/M)^2);对于LFM,如果用F个隐类,迭代S次,那么它的计算复杂度是(KFS)。一般情况下,LFM的时间复杂度要稍微高于UserCF和ItemCF,这主要是因为该算法需要多次迭代。总体上时间复杂度上没有质的差别。
- 在线实时推荐。UserCF和ItemCF在线服务算法需要将相关表缓存在内存中,然后可以在线进行实时的预测。LFM的预测公式可以看到,LFM在给用户生成推荐列表时,需要计算用户对所有物品的兴趣权重,然后排名,返回权重最大的N个物品。那么,物品很多时时间复杂度就会很高。因此,LFM不太适合用于物品非常庞大的系统,如果要用,我们也需要一个比较快的算法先给用户计算一个比较小的候选列表。另一方面,LFM生成一个用户推荐列表太慢,因此不能用于在线实时推荐。
- 推荐解释。ItemCF算法支持很好的推荐解释,但是LFM无法提供这样的解释。
网友评论