嘛~为了这个系列的完整性,所以还是简要介绍下推荐系统里的经典算法吧~虽然近期深度学习在推荐系统领域打的火热,但是由于工业界的应用场景不同,应用最广的还是这些经典算法,故而还是很值得学习的。
推荐系统领域的经典算法
1.基于人口统计学的推荐
即:特征相似的人喜欢的东西应该也类似。
比如上图,同个年龄段的女生喜欢的东西,比不同年龄段甚至不同性别的人喜欢的东西,更有可能被推荐。当然,图里只是简单的引入了“年龄”和“性别”特征,在真正运用的时候应该构建每个用户的用户画像,再根据其相似度实行推荐。
具体步骤:
- 对每个用户建模,构建其用户画像;
- 根据每个用户的用户画像,计算用户相似度;
- 推荐相似用户喜欢但该用户没看过的商品。
【具体常用的相似度计算方法可参考:点击这里】
- 好处:
- 由于不涉及当前用户的历史喜好,所以解决了“用户冷启动”问题。
- 而且不依赖于物品本身的数据,故而无论这个物品是“书籍”、“音乐”还是“短视频”都可以使用,即它是领域独立的(domain-independent)
- 坏处:
- 用户画像所需要的有些数据难以获取。
- 一对双胞胎,特征经历类似,兴趣就一定相同吗?答案是否定的!特别是“书籍”“音乐”这种涉及到个人喜好的商品,单用这种方法更是难以达到很好的效果。
2. 基于内容的推荐
即:考虑用户可能喜欢某类型的情况
比如上图,用户A喜欢电影A,而电影A是属于“爱情”“浪漫”类型的,那就给他继续推荐该类型的其他电影,如电影C。就像我说我喜欢《千与千寻》,你可能会觉得我也喜欢《幽灵公主》(我的确都很喜欢hhh)。
步骤与基于人口统计学类似,只是将对用户进行用户画像改为对物品构建特征集合:
- 构建物品特征集合(特征包含关键词、标签等);
- 根据物品特征集合,计算物品相似度;
- 根据用户以往喜好,寻找与其相似的物品进行推荐。
- 优点:
- 不存在稀疏性和“项目冷启动”问题;
- 简单有效,推荐结果具有可解释性,不需要领域知识;
- 基于物品本身特征推荐,不存在过度推荐热门的问题
- 解决了基于人口统计学对个人兴趣建模的缺失,能够很好的建模用户的喜好,实现更精确的推荐;
- 缺点:
- 推荐的结果没有新颖性;
- 由于需要基于用户的兴趣偏好进行推荐,故而存在“用户冷启动”问题。
- 该方法受推荐对象特征提取能力的限制。由于是根据物品相似度进行推荐,故而,物品特征构建模型的完善和全面决定了最后推荐的质量,然而像图像、音频等这种类型的特征难以提取;
3. 基于协同过滤的推荐
协同过滤推荐(collaborative filtering recommendation)是推荐算法中应用最为广泛的算法。其基本思想借鉴了集体的智慧,不需要对项目或用户进行特殊处理,只需要通过用户建立物品与物品之间的联系。就比如,大多能成为朋友的都是志同道合的,那么当我身边的朋友都说《想见你》好看的时候,那我就有很大概率也会喜欢(User-based CF)。或者说我很喜欢《千与千寻》,那么当看到许多看过《千与千寻》的人评价《幽灵公主》很高时,我喜欢《幽灵公主》的可能性也很高(Item-based CF)。
注意:这里跟基于人口统计学和基于内容是不一样的。 基于人口统计学关注 用户本身的画像特征相似度决定相似用户集,而 User-based CF是根据 用户对物品的喜好相似度决定相似用户集。 基于内容的推荐根据 物品本身内容的相似度决定相似项目集,而 Item-based CF与User-based CF类似,其根据 不同用户对不同物品的喜好计算物品间的关系 ,获得相似项目集。
下面具体分析,基于协同过滤的推荐算法分为两类:
基于内存的协同过滤算法、基于模型的协同过滤算法
其中基于内存的协同过滤包括基于用户的协同过滤和基于项目的协同过滤两种
- 基于用户的协同过滤(User-based CF):推荐喜好相似用户喜欢的物品
- 基于项目的协同过滤(Item-based CF):推荐有相同喜好用户喜欢的相似物品
- 基于模型的协同过滤(Model-based CF):也叫做基于学习的方法,通过定义一个参数模型来描述用户与物品,用户与用户(或者物品与物品)之间的关系,然后通过优化过程得到模型参数。
1) 基于用户的协同过滤(User-based CF)
如上图:用户ABC中,用户A与C的喜好情况最为相似(都喜欢物品A、C),那么就会将用户C喜欢的但用户A没看过的物品D推荐给用户A。
具体步骤:
- 构建用户-项目的评分矩阵,并计算用户的相似度;
- 通过阈值法或者KNN法,生成近邻用户集;
- 根据近邻用户集的项目集合(去掉待推荐用户看过的项目)中,根据加权法得出推荐用户的推荐项目集topN。
阈值法:即通过设定相似度阈值来确定最近邻用户。若用户v与用户u的相似度超过,则v被选为u的相似用户。特点:这种方法最后得出的最近邻用户数目不是一定的。 KNN法:取与用户v相似度最高的k个用户作为当前的最近邻用户。 特点:这种方法最后得出的最近邻用户数目是一定的。 加权法:对用户u已打分的物品的分数进行加权求和,权值为各个物品与物品i的相似度,然后对所有物品相似度的和求平均,计算得到用户u对物品i打分,公式如下:
其中为物品i与各个物品的相似度,为用户u对各个物品的打分。
User-based CF 特点:
- 性能:适用于用户较少的场合,如果用户很多,计算用户相似度矩阵代价很大。
- 领域:适用于时效性较强,用户个性化兴趣不太明显的领域。
- 实时性:用户有新行为,不一定造成推荐结果的立即变化。
- 冷启动:
- 在新用户对很少的物品产生行为后,不能立即对它进行个性化推荐,因为用户相似度表示每隔一段时间离线计算的,故而存在“用户冷启动”问题。
- 新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给和对它产生行为的用户兴趣相似的其他用户,故而解决了“项目冷启动”问题。
- 推荐理由:很难提供令用户信服的推荐解释。
2)基于项目的协同过滤(Item-based CF)
如上图:用户A、C都喜欢物品A,而用户A还喜欢物品C,且物品C与物品A相似,故而就会给用户A推荐物品C。
具体步骤:
- 构建用户项目-用户的评分矩阵,并计算项目的相似度;
- 通过阈值法或者KNN法,生成近邻项目集;
- 根据近邻项目集’(去掉该用户看过的项目)中,根据加权法得出推荐用户的推荐项目集topN。
Item-based CF 特点:
- 性能:适用于物品数明显小于用户数的场合,如果物品很多,计算物品的相似度矩阵的代价就会很大。
- 领域:适合于长尾物品丰富,用户个性化需求强烈的领域。
- 实时性:用户有新行为,一定会导致推荐结果的实时变化。
- 冷启动:
- 新用户只要对一个物品产生行为,就可以给它推荐和该物品相关的其它物品,故而解决了“用户冷启动”问题。
- 但没有办法在不离线更新物品相似度表的情况下将新的物品推荐给用户,故而存在“项目冷启动”问题。
- 推荐理由:利用用户的历史行为给用户做推荐解释,可以令用户比较信服。
总体来说说基于内存的协同过滤算法的优缺点:
- 优点:
- 不需要对物品或者用户进行严格的建模,也不需要领域知识;
- 集体智慧可以很好的支持用户发现潜在的兴趣偏好。
- 缺点:
- 存在稀疏性问题;
- 方法的核心是基于历史数据,所以对新项目和新用户都有“冷启动”问题;
- 对于一些特殊品味的用户不能给予很好的推荐;
- 推荐的效果依赖于用户历史偏好数据的多少和准确性;
- 由于以历史数据为基础,抓取和建模用户的偏好后,很难修改或者根据用户的使用演变,从而导致这个方法不够灵活。
3)基于模型的协同过滤(Model-based CF)
基于模型的协同过滤推荐就是基于样本的用户喜好信息,训练一个推荐模型,然后根据实时的用户喜好的信息进行预测,计算推荐。
常用的训练模型包括:pLSA,LDA,聚类,SVD,Matrix Factorization,LR,GBDT等,这种方法训练过程比较长,但是训练完成后,推荐过程比较快且准确。因此它比较适用于实时性比较高的业务如新闻、广告等。当然,若是需要这种算法达到更好的效果,还需要人工干预反复的进行属性的组合和筛选,也就是我们常说的特征工程。而由于新闻的时效性,系统也需要反复更新线上的数学模型,以适应变化。
2. 基于混合的推荐
上面推荐的几种算法,多多少少都有各自的优点和缺点,故而若将多个方法混合在一起,可能会达到更好的推荐效果。关于如何组合各个推荐机制,这里讲几种比较流行的组合方法。
- 加权的混合(Weighted Hybridization): 用线性公式(linear formula)将几种不同的推荐按照一定权重组合起来,具体权重的值需要在测试数据集上反复实验,从而达到最好的推荐效果。
- 切换的混合(Switching Hybridization):对于不同的情况(数据量,系统运行状况,用户和物品的数目等),推荐策略可能有很大的不同,那么切换的混合方式,就是允许在不同的情况下,选择最为合适的推荐机制计算推荐。
- 分区的混合(Mixed Hybridization):采用多种推荐机制,并将不同的推荐结果分不同的区显示给用户。其实,Amazon,当当网等很多电子商务网站都是采用这样的方式,用户可以得到很全面的推荐,也更容易找到他们想要的东西。
- 分层的混合(Meta-Level Hybridization): 采用多种推荐机制,并将一个推荐机制的结果作为另一个的输入,从而综合各个推荐机制的优缺点,得到更加准确的推荐。
总结:
这里只是简单介绍了几个经典的推荐算法,常用的相似度计算方法和具体实例可以参考下我放的第二个和第三个链接。代码实现方面,大家可以在上网或在GitHub上搜索自己跑一遍。笔者在整理成这篇文章的过程中,发现自己以前有些理解的很模糊,所以说光看还是没用的,还是要动手实践呀!
冲冲冲!
参考链接:
https://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy1/index.html#icommentswww.ibm.com https://blog.csdn.net/y990041769/article/details/77837915?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-taskblog.csdn.net 协同过滤推荐算法的原理及实现_大数据_William Zhao's notes-CSDN博客blog.csdn.net参考书目:
《推荐系统实战》项亮著