机器学习(二十九)— 推荐算法(协调过滤)
协同过滤的模型一般为m个物品,m个用户的数据,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。
一般来说,协同过滤推荐分为三种类型。第一种是基于用户(user-based)的协同过滤,第二种是基于项目(item-based)的协同过滤,第三种是基于模型(model based)的协同过滤。
1、基于用户(user-based)的协同过滤
主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。
基于用户的CF原理如下:
- 1、分析各个用户对item的评价(通过浏览记录、购买记录等);
- 2、依据用户对item的评价计算得出所有用户之间的相似度;
- 3、选出与当前用户最相似的N个用户;
- 4、将这N个用户评价最高并且当前用户又没有浏览过的item推荐给当前用户。
举个栗子,基于用户的CF算法大致的计算流程如下:
(1)根据网站的记录计算出一个用户与item的关联矩阵,即每个用户对商品的评分
(2)计算用户与用户之间的相似度,使用余弦距离,值越大说明越相似。
(3)我们要为用户1推荐物品,则找出与用户1相似度最高的N名用户(设N=2)评价的物品,去掉用户1评价过的物品,则是推荐结果。
优缺点:
-
优点: 在数据集完善、内容丰富的条件下,能够获得较高的准确率,而且能避开Item Profile上的挖掘进行推荐,能够对物品的关联性、用户的偏好进行隐式透明的挖掘。
-
缺点: 随着系统用户数量的增大,计算Top-K Relevance User的时间会显著增长,使得该方法难以胜任用户量变化巨大的系统;新用户加入,打分记录很少,难以准确计算Top-K Relevance User.
- 适用用户较少的场合,否则用户相似度矩阵计算代价很大。
- 适合时效性较强,用户个性化兴趣不太明显的领域。
- 用户有新行为,不一定造成推荐结果的立即变化。
- 对新用户不友好,对新物品友好,因为用户相似度矩阵需要离线计算.
- 很难提供令用户信服的推荐解释。
2、基于项目(item-based)的协同过滤
找到物品和物品之间的相似度,只有找到了目标用户对某些物品的评分,那么我们就可以对相似度高的类似物品进行预测,将评分最高的若干个相似物品推荐给用户。比如,你在网上买了一本机器学习相关的书,网站马上会推荐一堆机器学习,大数据相关的书给你,这里就明显用到了基于项目的协同过滤思想。
基于物品的CF原理大同小异,只是主体在于物品:
- 1、分析各个用户对item的浏览记录。
- 2、依据浏览记录分析得出所有item之间的相似度;
- 3、对于当前用户评价高的item,找出与之相似度最高的N个item;
- 4、将这N个item推荐给用户。
优缺点:
- 优点:
- 为特殊兴趣爱好的用户进行推荐
- 通过列出推荐项目的内容特征,可以解释为什么推荐那些项目
- 能推荐新的或不是很流行的项目,没有新项目问题。
- 不需要其它用户的数据,没有冷开始问题和稀疏问题。
- 已有比较好的技术,如关于分类学习方面的技术已相当成熟。
- 缺点:是要求内容能容易抽取成有意义的特征,要求特征内容有良好的结构性,并且用户的口味必须能够用内容特征形式来表达,不能显式地得到其它用户的判断情况
-
优点: 计算简单,容易实现实时响应。由于Item被打分的变化剧烈程度低,,因此 Item 相似度的计算一般可以采用离线完成、定期更新的方式,从而减少了线上计算;可解释性好。
-
缺点: :以物品为基础的系统过滤较少考虑用户之间的差别,因此精
度较 User-Based 方法稍微逊色一点;还有数据稀疏性(Sparsity)和冷启动(Cold-Start)的问题。
- 适用于物品数明显小于用户数的场合,否则物品相似度矩阵计算代价很大。
- 适合长尾物品丰富,用户个性化需求强的领域。
- 用户有新行为,一定导致推荐结果的实时变化。
- 对新用户友好,对新物品不友好,因为物品相似度矩阵需要离线计算。
- 用用户历史行为做推荐解释,比较令用户信服。
3、协同过滤(CF)算法确实简单,而且很多时候推荐也是很准确的。然而它也存在一些问题:
- 1、依赖于准确的用户评分;
- 2、在计算的过程中,那些大热的物品会有更大的几率被推荐给用户;
- 3、冷启动问题。当有一名新用户或者新物品进入系统时,推荐将无从依据;
- 4、在一些item生存周期短(如新闻、广告)的系统中,由于更新速度快,大量item不会有用户评分,造成评分矩阵稀疏,不利于这些内容的推荐。
优点:
- 能够过滤难以进行机器自动内容分析的信息,如艺术品,音乐等。
- 能够发掘用户的潜在兴趣。
- 过滤掉一些复杂、难以表述的概念。
缺点:
- 不能实时推荐,必须有用户行为后(最初评价问题)。
- 用户对商品的评价非常稀疏,这样基于用户的评价所得到的用户间的相似性可能不准确(即稀疏性问题)
- 冷启动问题。
4、基于模型的协同过滤
我们的问题是这样的m个物品,m个用户的数据,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。
对于这个问题,用机器学习的思想来建模解决,主流的方法可以分为:用关联算法,聚类算法,分类算法,回归算法,矩阵分解,神经网络,图模型以及隐语义模型来解决。
(1)常用的关联推荐算法有Apriori,FP Tree和PrefixSpan。
一般我们可以找出用户购买的所有物品数据里频繁出现的项集活序列,来做频繁集挖掘,找到满足支持度阈值的关联物品的频繁N项集或者序列。如果用户购买了频繁N项集或者序列里的部分物品,那么我们可以将频繁项集或序列里的其他物品按一定的评分准则推荐给用户,这个评分准则可以包括支持度,置信度和提升度等。
(2)常用的聚类推荐算法有K-Means, BIRCH, DBSCAN和谱聚类。
用聚类算法做协同过滤就和前面的基于用户或者项目的协同过滤有些类似了。我们可以按照用户或者按照物品基于一定的距离度量来进行聚类。如果基于用户聚类,则可以将用户按照一定距离度量方式分成不同的目标人群,将同样目标人群评分高的物品推荐给目标用户。基于物品聚类的话,则是将用户评分高物品的相似同类物品推荐给用户。
(3)常见的分类推荐算法有逻辑回归和朴素贝叶斯,两者的特点是解释性很强。
如果我们根据用户评分的高低,将分数分成几段的话,则这个问题变成分类问题。比如最直接的,设置一份评分阈值,评分高于阈值的就是推荐,评分低于阈值就是不推荐,我们将问题变成了一个二分类问题。虽然分类问题的算法多如牛毛,但是目前使用最广泛的是逻辑回归。为啥是逻辑回归而不是看起来更加高大上的比如支持向量机呢?因为逻辑回归的解释性比较强,每个物品是否推荐我们都有一个明确的概率放在这,同时可以对数据的特征做工程化,得到调优的目的。目前逻辑回归做协同过滤在BAT等大厂已经非常成熟了。
(4)常用的回归推荐算法有Ridge回归,回归树和支持向量回归。
用回归算法做协同过滤比分类算法看起来更加的自然。我们的评分可以是一个连续的值而不是离散的值,通过回归模型我们可以得到目标用户对某商品的预测打分。
(5)矩阵分解
用矩阵分解做协同过滤是目前使用也很广泛的一种方法。由于传统的奇异值分解SVD要求矩阵不能有缺失数据,必须是稠密的,而我们的用户物品评分矩阵是一个很典型的稀疏矩阵,直接使用传统的SVD到协同过滤是比较复杂的。
目前主流的矩阵分解推荐算法主要是SVD的一些变种,比如FunkSVD,BiasSVD和SVD++。这些算法和传统SVD的最大区别是不再要求将矩阵分解为UΣVTUΣVT的形式,而变是两个低秩矩阵PTQPTQ的乘积形式。
(6)用神经网络乃至深度学习做协同过滤应该是以后的一个趋势。目前比较主流的用两层神经网络来做推荐算法的是限制玻尔兹曼机(RBM)。在目前的Netflix算法比赛中, RBM算法的表现很牛。当然如果用深层的神经网络来做协同过滤应该会更好,大厂商用深度学习的方法来做协同过滤应该是将来的一个趋势。后续我会专门开篇来讲讲RBM。
(7)推荐系统新方向
a) 基于集成学习的方法和混合推荐:这个和混合推荐也靠在一起了。由于集成学习的成熟,在推荐算法上也有较好的表现。一个可能取代逻辑回归的算法是GBDT。目前GBDT在很多算法比赛都有好的表现,而有工业级的并行化实现类库。
b)基于矩阵分解的方法:矩阵分解,由于方法简单,一直受到青睐。目前开始渐渐流行的矩阵分解方法有分解机(Factorization Machine)和张量分解(Tensor Factorization)。
c) 基于深度学习的方法:目前两层的神经网络RBM都已经有非常好的推荐算法效果,而随着深度学习和多层神经网络的兴起,以后可能推荐算法就是深度学习的天下了?目前看最火爆的是基于CNN和RNN的推荐算法。
参考:https://www.cnblogs.com/pinard/p/6349233.html