推荐系统算法:基于近邻协同过滤

  • 基于近邻协同过滤可分为基于用户的协同过滤和基于物品的协同过滤

基于用户的协同过滤

基于用户的协同过滤(User Collaborative Filtering,简称User CF)核心是“人以群分”

基本原理
  • 通过用户对不同内容(物品)的行为,来评测用户之间的相似性,找到“邻居”基于这种相似性做出推荐
  • 这种推荐的本质是,给相似的用户推荐其他用户喜欢的内容
  • 这就是我们经常看到的:和你类似的人还喜欢如下内容
    推荐系统算法:基于近邻协同过滤_第1张图片 从这个图中我们可以看出,用户A喜欢的物品有物品A,物品B,物品C;用户B喜欢的物品只有物品B;用户C喜欢的物品有物品A,物品C,物品D。我们可以看出用户A 和用户C的喜好很相似,这时候我们就可以把物品D推荐给用户A。这就是给相似的用户推荐其他用户喜欢的物品。
基本步骤:

① 找到和目标用户兴趣相似的用户集合(关键在于计算两个用户之间的兴趣相似度)
② 找到这个集合中的用户所喜欢的,并且目标用户没有听说过的物品推荐给目标用户
如何找到和你相似的人?
类比于KNN中K个“邻居”的寻找方法——通过距离衡量相近程度
推荐系统算法:基于近邻协同过滤_第2张图片

用户相似性计算指标


推荐系统算法:基于近邻协同过滤_第3张图片
我们一般使用余弦相关系数进行相似度的计算,小伙伴们不用担心,在sklearn中,有封装好的余弦函数,我们直接调用就好
在这里插入图片描述
具体过程我们可以概况为:
1.导入数据
2.读入用户评分
3.计算用户相似性
4.根据用户相似性排序选择前K个邻居
5.根据K个邻居的评分项目预测用户评分
6.选择用户评分最高的前N个项目作为推荐列表
这种方法也具有局限性,每次计算相似度,每次都要遍历数据进行计算,遍历所有的用户及评分,导致了时间复杂性变高。
在网站用户增加到一定程度后,计算用户之间的相似度会便得越来越复杂和困难,另外。基于用户的协同过滤方法数学性不是很好(不太容易理解)。
数据稀疏,用户和用户之间有共同消费行为或是爱好实际上比较少,而且一般是热门物品,对发现用户兴趣帮助不大。
因此,全球著名的电子商务公司亚马逊的研发团队,提出了基于物品的协同过滤算法(Item-toItem Collaborative Filtering,简称ItemCF),用来给用户推荐那些和他们之前喜欢的物品相似的物品。

基于物品的协同过滤

基本原理:
  • 基于物品的协同过滤的原理和基于用户的协同过滤类似。只是在计算邻居时采用物品本身,而不是从物品的角度,即基于用户对物品的偏好找到相似的物品
  • 然后根据用户的历史偏好,推荐相似的物品给用户
  • 从计算机的角度来看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的相似物品后,根据用户历史的偏好预测当前用户还没有表示偏好的物品
  • 计算得到一个排序列表作为推荐
  • 构建用户物品的关系矩阵,矩阵元素可以是用户的消费行为,也可以是消费后的评价,还可以是度消费行为的某种量化如时间、次数、费用等。加入矩阵的行表示物品,列表示用户的话,那么就是两两计算行向量之间的相似度,得到物品相似度矩阵,行和列都是物品,最终产生推荐结果
    推荐系统算法:基于近邻协同过滤_第4张图片
    用户A喜欢的有物品A,物品C;用户B喜欢的有物品A,物品B,物品C;用户C喜欢的有物品A;物品A和物品C相似,我们就可以给用户C推荐物品C。
相似度的计算

1.计算物品之间的相似度
最基本的相似度计算公式:
在这里插入图片描述
分母|? ? | 是喜欢物品i的用户数,而分子|?(?) ∩ ?(?) |是同时喜欢物品i和物品j的用户数。因此,上述公式可以理解为喜欢物品i的用户中有多少比例的用户也喜欢物品j。这个公式惩罚了物品j的权重,因此减轻了热门物品会和很多物品相似的可能性
2.根据物品的相似度和用户的历史行为给用户生成推荐列表

我们举一个下例子看一下基于用户协同过滤代码的实现:

1.我们导入数据(数据是随意写的,仅作参考),如下图所示:
推荐系统算法:基于近邻协同过滤_第5张图片
2.根据用户id和物品id构建矩阵
使用 pivot函数,构建透视表,返回一对一的关系,一对多的关系用pivoet_table
用户id作为行索引, 物品id作为列索引, 统计对应用户和物品之间的相关 喜好程度值。
将缺失值填充为0,形成最终的数组,二维数值等价于矩阵,但不是真正的矩阵。
推荐系统算法:基于近邻协同过滤_第6张图片推荐系统算法:基于近邻协同过滤_第7张图片
3.计算相似度矩阵(余弦)
推荐系统算法:基于近邻协同过滤_第8张图片
4.基于协同过滤的函数
这里我们用的是减去平均数的计算方法,首先将评分状况score和每个物品的权重weight初始化,用user_id_action定义这个用户对所有物品的评分,用item_id_action定义所有用户对这个物品的评分,计算所有用户的相似度user_id_similar,排序找出最大的k个用户相似度similar_index,定义一个用户对所有物品的平均分user_id_i_mean。建立一个for循环,计算的是, 这K个用户对物品的推荐分数 ,然后还要进行加权,如果评分是0,没有往下计算的意义,所以这里要使item_id_action[j]!=0,user_id_mean_for_j是计算改用户的评分平均值对score、weight进行一个更新.如果减去了均值,结尾要用均值+分数/权重。
推荐系统算法:基于近邻协同过滤_第9张图片
5.预测矩阵
基于余弦相似度矩阵进行预测,最终构成了预测矩阵
预测每一个用户对每一个物品的评分,所以要嵌套两层循环。如果评分不等于0说明已经预测过了,原本是等于0的,不用在进行预测了,所以这里不等于0,预测完了后赋值给初始化的全零矩阵定位到的user_id和item_id对应的那个数,让它等于推荐函数计算出来的推荐指数。
推荐系统算法:基于近邻协同过滤_第10张图片
查看user_similar相似度矩阵的预测矩阵
在这里插入图片描述
推荐系统算法:基于近邻协同过滤_第11张图片
构建最终的推荐函数
返回topN的函数
输入一个分组之后的对象(group),选取n个值,根据推荐指数进行排序,返回前n个
在这里插入图片描述
推荐函数
1.先将用户预测数据,构建成一个DataFrame
2.将数据进行转换,用stack()(一行一行的变)这个方式进行转换,重置索引
3.对列名进行修改,用rename单独针对于某一列
4.根据用户ID进行分组
5.得到分组后的前及格数据
6.删除用户ID列
7.删除多余的索引
8.将索引重新排列
推荐系统算法:基于近邻协同过滤_第12张图片
最终结果:
推荐系统算法:基于近邻协同过滤_第13张图片

你可能感兴趣的:(协同过滤,推荐系统,数据分析,近邻)