提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
一、协同过滤
1、含义
- 协同(collaborating)是群体行为,过滤(filtering)则是针对个人的行为
- 利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息
- 来源比如:实际生活中,朋友之间相互推荐自己喜欢的东西
2、策略
- 协同过滤通过用户和产品及用户的偏好信息产生推荐
- 最基本的策略有两种:
- 找到具有类似品味的人所喜欢的物品
- 从一个人喜欢的物品找类似的物品
- 这两种策略对应两个最知名的类别推荐技术
- 基于用户的协同过滤
- 基于物品的协同过滤
二、基于用户的协同过滤
- 基于用户的协同过滤(user collaborating filter,简称userCF)通过用户对不同内容(物品)的行为来评测用户之间的相似性,找到“邻居”基于这种相似性做出推荐
- 这种推荐的本质是给相似的用户推荐其他用户喜欢的内容
1、寻找相似偏好的用户
比如5个用户对2件商品的评分。这里的分值可能表示真实的购买,也可以是用户对商品不同行为的量化指标。例如,浏览商品次数、向朋友推荐商品、收藏、分享或评论等,都可以表示用户对商品的态度和偏好程度;
画出散点图后,即可看出用户分布情况,用户距离接近,,则评分较为接近;
2、欧式距离及系数
欧几里得距离:
d(a, b) = √[ Σ(xᵢ₁ - xᵢ₂)² ] (i = 1, 2, ..., n)
欧几里得系数:
d(a, b) = 1 / ( 1+ d(a, b) )
系数越小,表示2用户距离越近,用户偏好也接近。
3、皮尔逊系数
-
r=1:表示两个变量完全正相关。
-
r=−1:表示两个变量完全负相关。
-
r=0:表示两个变量没有线性关系。
-
r 的绝对值越接近 1,表示两个变量之间的线性关系越强;越接近 0,表示线性关系越弱。
-
极强相关:r>0.80
-
强相关:0.61<r≤0.80
-
中度相关:0.41<r≤0.60
-
弱相关:0.21<r≤0.40
-
极弱相关/无相关:r≤0.20
4、其他系数
- 余弦相似度系数
- 杰卡德系数
5、算法步骤
- 找到和目标用户兴趣相似的用户集合(计算两个用户之间的兴趣相似度)
- 找到这个集合中的用户所喜欢的,并且目标用户没有使用(消费)过的物品推荐给目标用户
6、局限性
- 首先每次计算用户直接相似度的时候,需要遍历每个用户和所有用户的评分,这样在网站用户增长到一定程度后,计算用户直接的相似度的过程将会变得越发的困难
- 基于用户的协同过滤算法,并不容易从数学原理的角度解释
- 用户口味变化快,非静态,所以兴趣迁移问题很难反应出来
- 数据稀疏,用户和用户之间有共同的消费行为实际上是比较少的,而且一般都是一些热门物品,对发现用户兴趣帮助也不大
三、基于物品的协同过滤
1、介绍
- 基于物品的协同过滤(item collaborating filter,简称item CF)算法给用户推荐那些和他们之前喜欢的物品相似的物品;
- 如购买该商品的用户还购买来其他商品
基于物品的协同过滤和基于用户的协同过滤原理相似,只是在计算邻居时采用物品本身,而不是从用户的角度,即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给用户。
2、算法步骤
- 计算物品之间的相似度
- 根据物品相似度和用户历史行为给用户生成推荐列表
3、优缺点
4、2种算法适应场景
四、电影推荐代码示例
1、读入数据
#导入相关的包
import pandas as pd
import warnings
warnings.filterwarnings("ignore")
import os
films=pd.read_excel("./data/apriori/电影.xlsx")
films.head(3)
2、数据处理
#将电影数据和评分数据进行拼接
model_data=pd.merge(films,scores,on="电影编号")
model_data.head()
3、查看评分分布
#查看评分的分布
model_data["评分"].hist()
# 计算每部电影的平均分
model_data_mean=model_data.groupby("名称")["评分"].mean()
# 评分高的前五部电影
film_top=pd.DataFrame(model_data_mean)
film_top.sort_values("评分",ascending=False).head()
# 打分人数
film_top["评分次数"]=model_data.groupby("名称")["评分"].count()
film_top.sort_values("评分次数",ascending=False).head()
# 合并后的数据
model_data.head(5)
use_item=model_data.pivot_table(index="用户编号",columns="名称",values="评分")
use_item.head()
4、选取电影对用户推荐
Calculate_film=use_item["沉默的羔羊(1991)"]
# 空值填充0
use_item=use_item.fillna(0)
#计算该目标电影和其他电影的相似程度
corr_matrix=use_item.corrwith(Calculate_film)
corr_matrix.head()
# 数据转换
recommend_list=pd.DataFrame(corr_matrix)
recommend_list=recommend_list.rename(columns={0:"相关程度"})
recommend_list=recommend_list.sort_values("相关程度",ascending=False)
recommend_list.head()