头条推荐算法——协同过滤、内容推荐算法介绍与Python实现(三)

在前两篇 、 中,简单分享了热度推荐、协同过滤、内容推荐的算法概述,以及基于用户协同过滤算法的Python实现。此篇主要分享基于物品的协同过滤算法Python实现。

基于物品的协同过滤算法概述

协同过滤:可以简单理解为"人以群分"的算法解释,通过海量数据中人的历史行为,计算物品的相似度,然后将与你喜欢物品的相似物品推荐给你。

头条推荐算法——协同过滤、内容推荐算法介绍与Python实现(三)

基于物品的协同过滤

上图示意出基于物品的协同过滤推荐机制的基本原理,假设Charles喜欢文章A/B,用户Mark喜欢文章A/C,Bill喜欢文章B,从这些用户的历史喜好记录中,我们可以发现喜欢文章A的人都喜欢文章B,因此文章A与文章B比较类似,那么我们可以推断Bill很有可能也喜欢文章A,所以系统会将文章A推荐给Bill。

相似度的几种度量方式

此篇中只应用相对常见的几种相似度度量算法,如欧几里得距离、皮尔逊相似度、余弦相似度。这几种度量方法的区别可以看下我的另一篇文章 。其中皮尔逊相似度可以简单的看做是升级版本的欧几里得度量算法,因为它提供了对于变量度量单位不同的处理步骤。因此对不同变量间的取值范围没有要求。是以拟合的方法来判断两个数据的相关性,和欧式方法相比更适合数据不是很规范的情况。

欧几里得距离

头条推荐算法——协同过滤、内容推荐算法介绍与Python实现(三)

皮尔逊相似度

头条推荐算法——协同过滤、内容推荐算法介绍与Python实现(三)

余弦相似度

头条推荐算法——协同过滤、内容推荐算法介绍与Python实现(三)

有兴趣的可以了解下修正后的余弦相似度计算方式,主要解决余弦相似度仅考虑向量维度方向上的相似而没考虑到各个维度的量纲的差异性,所以在计算相似度的时候,做了每个维度减去均值的修正操作。

基于物品的协同过滤推荐算法实现步骤

  • 格式化数据 获取ratings_dict

转换成数据ratings_dict表示某个电影的所有用户的评分集合,并对评分进行归一化

  • 计算所有与movieId有交集的物品相似度

尝试余弦相似度度

皮尔逊相似度

欧几里德距离

  • 根据相似度生成推荐电影列表

根据用户已经观看的电影,将相似电影推荐给用户,非关键代码,暂不实现。

基于物品的协同过滤推荐的算法Python实现

格式化数据 获取ratings_dict

头条推荐算法——协同过滤、内容推荐算法介绍与Python实现(三)

计算所有与movieId有交集的物品相似度

头条推荐算法——协同过滤、内容推荐算法介绍与Python实现(三)

使用不同的相似度度量方法,我们movieid为3016的相似电影如下:

使用余弦相似度度量的物品相似度结果

['993', '981', '972', '939', '90', '884', '854', '843', '827', '814']

使用欧几里得距离度量的物品相似度结果

['993', '989', '985', '977', '975', '972', '939', '90', '895', '889']

使用皮尔逊相似度度量的物品相似度结果

['754', '108', '1138', '1743', '3772', '1169', '993', '3119', '3205', '2984']


分享到:


相關文章: