推荐算法分类
1 个性化推荐
1.1 基于用户推荐(Demographic-based Recommendation)
推荐流程:
- 获取用户的注册信息。
- 根据用户的注册信息对用户分类。
- 给用户推荐她所属分类中用户喜欢的物品。
1.2 基于内容推荐(Content-based Recommendation)
思想:
根据用户过去的浏览记录,向用户推荐用户没有接触过的推荐项。
推荐步骤:
一般是基于关键词进行推荐,比如看了《权力的游戏1》就给你推荐后面的剧集,但是可能推荐重复,因为关键词相同。
优点:
- 没有冷启动问题
- 不需要惯用数据
- 没有流行度偏见,可以推荐有罕见特性的项
- 可以使用用户内容特性来提供解释
缺点:
- 项内容必须是机器可读的和有意义的
- 容易归档用户
- 很难有意外,缺少多样性
- 很难联合多个项的特性
1.3 基于关联规则推荐(Association Rule-based Recommendation)
思想:
在一个交易数据库中统计购买了商品集X的交易中有多大比例的交易同时购买了商品集Y。
1.4 基于效用推荐(Utility-based Recommendation)
思想:
基础理论:效用函数。
1.5 基于知识推荐(Knowledge-based Recommendation)
思想:
建议某一领域的一套规则,进行推荐。
1.6 协同过滤算法(Collaborative Filtering)
优点:
- 需要最小域
- 不需要用户和项
- 大部分场景中能够产生足够好的结果
缺点:
- 冷启动问题
- 需要标准化产品
- 需要很高的用户和项的比例(1:10)
- 流行度偏见(有长尾的时候表现不够好)
- 难于提供解释
1.6.1 基于领域的方法(neighborhood-based)
1.6.1.2 基于用户的协同推荐(UserCF)
思想:
给用户推荐和他兴趣相似的其他用户喜欢的物品。
推荐步骤:
- 找到和目标用户兴趣相似的用户集合。
- 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
优缺点:
- 性能:适用于用户较少的场合,如果用户很多,计算用户相似度矩阵代价很大。
- 领域:时效性较强,社会性较强,用户个性化不太明显的领域。
- 实时性:用户有新行为,不一定造成推荐结果的立即变化。
- 冷启动:在新用户对很少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度表是每隔一段时间离线计算的。新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给和对它产生行为的用户兴趣相似的其他用户。
- 推荐理由:很难提供令用户信服的推荐解释。
1.6.1.2 基于内容的协同推荐(ItemCF)
思想:
给用户推荐和他之前喜欢的物品相似的物品。
推荐步骤:
1. 计算物品的相似度。
2. 根据物品的相似度和用户的历史行为给用户生成推荐列表。
优缺点:
- 性能:适用于物品数明显小于用户数的场合,如果物品很多(网页),计算物品相似度矩阵代价很大。
- 领域:长尾物品丰富,用户个性化需求强烈的领域。
- 实时性:用户有新行为,一定会导致推荐结果的实时变化。
- 冷启动:新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品。但没有办法在不离线更新物品相似度表的情况下将新物品推荐给用户。
- 推荐理由:利用用户的历史行为给用户做推荐解释,可以令用户比较信服。
1.6.2 基于模型的协同过滤(ItemCF)
思想:
有m个物品,m个用户的数据,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。
主要方法:
- 关联算法
- 聚类算法
- 分类算法
- 回归算法
- 矩阵分解
- 神经网络
- 基于图的随机游走算法(random walk on graph)
- 隐语义模型
1.6.2.1用关联算法做协同过滤
思想:
找出用户购买的所有物品数据里频繁出现的项集活序列,来做频繁集挖掘,找到满足支持度阈值的关联物品的频繁N项集或者序列。如果用户购买了N项集或者序列里的部分物品,那么我们可以将频繁项集或者序列里的其他物品按照一定的评分准则推荐给用户,这个评分准则可以包括支持度、置信度和提升度等。
常用算法:
1.6.2.2 用聚类算法做协同过滤
思想:
按照物品基于一定的距离度量来进行聚类。如果基于用户聚类,则可以将用户按照一定距离度量方式分成不同的目标人群,将同样目标人群评分高的物品推荐给目标用户。基于物品聚类的话,则是将用户评分高物品的相似同类物品推荐给用户。
常用算法:
1.6.2.3 用分类算法做协同过滤
思想:
如果我们根据用户评分的高低,将分数分成几段的话,则这个问题变成分类问题。比如最直接的,设置一份评分阈值,评分高于阈值的就是推荐,评分低于阈值就是不推荐,我们将问题变成了一个二分类问题。虽然分类问题的算法多如牛毛,但是目前使用最广泛的是逻辑回归。为啥是逻辑回归而不是看起来更加高大上的比如支持向量机呢?因为逻辑回归的解释性比较强,每个物品是否推荐我们都有一个明确的概率放在这,同时可以对数据的特征做工程化,得到调优的目的。目前逻辑回归做协同过滤在BAT等大厂已经非常成熟了。
常用算法:
1.6.2.4 用回归算法做协调过滤
思想:
用回归算法做协同过滤比分类算法看起来更加的自然。我们的评分可以是一个连续的值而不是离散的值,通过回归模型我们可以得到目标用户对某商品的预测打分。
常用算法:
- 线性回归
- 决策树
- 支持向量机,线性支持回归
1.6.2.5 用矩阵分解做协同过滤
用矩阵分解做协同过滤是目前使用也很广泛的一种方法。由于传统的奇异值分解SVD要求矩阵不能有缺失数据,必须是稠密的,而我们的用户物品评分矩阵是一个很典型的稀疏矩阵,直接使用传统的SVD到协同过滤是比较复杂的。
目前主流的矩阵分解推荐算法主要是SVD的一些变种,比如FunkSVD,BiasSVD和SVD++。这些算法和传统SVD的最大区别是不再要求将矩阵分解为UΣVT的形式,而变是两个低秩矩阵PTQ的乘积形式。对于矩阵分解的推荐算法,后续我会专门开篇来讲。
1.6.2.6 用神经网络做协调过滤
用神经网络乃至深度学习做协同过滤应该是以后的一个趋势。目前比较主流的用两层神经网络来做推荐算法的是限制玻尔兹曼机(RBM)。在目前的Netflix算法比赛中, RBM算法的表现很牛。当然如果用深层的神经网络来做协同过滤应该会更好,大厂商用深度学习的方法来做协同过滤应该是将来的一个趋势。后续我会专门开篇来讲讲RBM。
1.6.2.7 用图模型做协同过滤
思想:
用图模型做协同过滤,则将用户之间的相似度放到了一个图模型里面去考虑,常用的算法是SimRank系列算法和马尔科夫模型算法。对于SimRank系列算法,它的基本思想是被相似对象引用的两个对象也具有相似性。算法思想有点类似于大名鼎鼎的PageRank。而马尔科夫模型算法当然是基于马尔科夫链了,它的基本思想是基于传导性来找出普通距离度量算法难以找出的相似性。后续我会专门开篇来讲讲SimRank系列算法。
推荐步骤:
- 将用户和对应行为用图模型表示出来。
- 在图模型中,从某用户的对应节点开始进行随机游走,最终得出物品的权重,进行推荐。
1.6.2.7 隐语义方法
思想:
通过潜在特征联系用户和物品。
隐语义模型主要是基于NLP的,涉及到对用户行为的语义分析来做评分推荐,主要方法有隐性语义分析LSA和隐含狄利克雷分布LDA,这些等讲NLP的再专门讲。
推荐步骤:
1. 基于用户的行为统计,按用户兴趣给物品分类。
2. 确定用户对哪些类别的物品感兴趣,以及感兴趣的程度。
3. 确定不同类别物品的权重,选择性推荐给用户。
分类:
- pLSA
- LDA
- 隐含类别模型( latent class model )
- 隐含主题模型( latent topic model )
- 隐含矩阵分解( matrix factorization )
1.7 混合推荐算法
思想:
综合利用协同过滤推荐算法和基于内容的推荐算法各自的优点同时抵消各自的缺点。
常用算法:
- 加权
- 交换
- 混合
- 特性组合
- 案列
- 特征增强
- 元层次
优点:
- 由于单独使用协同过滤推荐算法和基于内容的推荐算法
- 没有冷启动问题
- 没有流行度偏见,可推荐有罕见特性的项
- 可产生意外,实现多样性
缺点:
需要通过大量的工作才能得到正确的平衡。
1.8 基于图的随机游走算法(random walk on graph)
思想:
用图模型做协同过滤,则将用户之间的相似度放到了一个图模型里面去考虑,常用的算法是SimRank系列算法和马尔科夫模型算法。对于SimRank系列算法,它的基本思想是被相似对象引用的两个对象也具有相似性。算法思想有点类似于大名鼎鼎的PageRank。而马尔科夫模型算法当然是基于马尔科夫链了,它的基本思想是基于传导性来找出普通距离度量算法难以找出的相似性。后续我会专门开篇来讲讲SimRank系列算法。
1.9 基于深度学习的推荐算法
Youtube 基于深度学习的推荐算法:
论文:《Deep Neural Networks for YouTube Recommendations》
2 非个性化推荐
2.1 基于规则的推荐
思想:
基于最多用户点击,最多用户浏览等,在目前的大数据时代并不主流。
2.2 基于人口统计信息的推荐
思想:
简单的根据系统用户的基本信息发现用户的相关程度,然后进行推荐,目前在大型系统中已经较少使用。
协同过滤的新方向
当然推荐算法的变革也在进行中,就算是最火爆的基于逻辑回归推荐算法也在面临被取代。哪些算法可能取代逻辑回归之类的传统协同过滤呢?下面是我的理解:
基于集成学习的方法和混合推荐:这个和混合推荐也靠在一起了。由于集成学习的成熟,在推荐算法上也有较好的表现。一个可能取代逻辑回归的算法是GBDT。目前GBDT在很多算法比赛都有好的表现,而有工业级的并行化实现类库。
基于矩阵分解的方法:矩阵分解,由于方法简单,一直受到青睐。目前开始渐渐流行的矩阵分解方法有分解机(Factorization Machine)和张量分解(Tensor Factorization)。
基于深度学习的方法:目前两层的神经网络RBM都已经有非常好的推荐算法效果,而随着深度学习和多层神经网络的兴起,以后可能推荐算法就是深度学习的天下了?目前看最火爆的是基于CNN和RNN的推荐算法。
上下文感知推荐
学习等级
Mutil-armed bandits(探索/开发)
社会推荐
优点:
- 利于勉强维持最终性能百分点
- 你可以说你正在使用渐进的方式
缺点:
- 难于理解
- 缺乏推荐工具支持
- 没有为你的首个推荐系统提供推荐的方式
3 冷启动(Cold Start)问题
分类:
- 用户冷启动:解决如何给新用户做个性化推荐的问题。
- 物品冷启动:解决如何将新的物品推荐给可能对它感兴趣的用户。
- 系统冷启动:解决如何在一个新开发的网站上(还没有用户,也没有用户行为,只有一些物品的信息)设计个性化推荐系统,从而在网站刚发布时就让用户体验到个性化推荐服务这一问题。
- 提供非个性化的推荐:eg 热门排行榜。