UserCF原理及其实现

UserCF原理及其实现

基于用户的协同过滤的原理及其实现.使用数据来自MoviesLens.之后行为结构,先介绍MoviesLens数据集,然后介绍基于用户的协同过滤UserCF算法原理,最后使用MoviesLens数据集实现一个简单的电影推荐系统.

MoviesLens数据集

MovieLens数据集包含多个用户对多部电影的评分数据,也包括电影元数据信息和用户属性信息。这里使用ml-1m数据,解压后有4个文件:movies.dat, users.dat, ratings.dat以及README介绍文件.

movies.dat是电影数据信息文件,表明每个电影的信息,每行数据格式为:

1
2
MovieID::Title::Genres
# 电影编号::电影标题::电影分类

users.dat是用户信息文件,包含用户的ID,性别,年龄,职业,邮编地址

1
UserID::Gender::Age::Occupation::Zip-code
  • gender: M表示男性,F表示女性
  • age:
    • 1: “Under 18” 小于18岁
    • 18: “18-24”
    • 25: “25-34”
    • 35: “35-44”
    • 45: “45-49”
    • 50: “50-55”
    • 56: “56+”
  • occupation: 用户职业信息
    • 0: “other” or not specified
    • 1: “academic/educator”
    • 2: “artist”
    • 3: “clerical/admin”
    • 4: “college/grad student”
    • 5: “customer service”
    • 6: “doctor/health care”
    • 7: “executive/managerial”
    • 8: “farmer”
    • 9: “homemaker”
    • 10: “K-12 student”
    • 11: “lawyer”
    • 12: “programmer”
    • 13: “retired”
    • 14: “sales/marketing”
    • 15: “scientist”
    • 16: “self-employed”
    • 17: “technician/engineer”
    • 18: “tradesman/craftsman”
    • 19: “unemployed”
    • 20: “writer”

ratings.dat是用户对电影评分数据文件.每行数据格式为:

1
UserID::MovieID::Rating::Timestamp

  • UserIDs 范围在 1 - 6040
  • MovieIDs 范围在 1 - 3952
  • Ratings 评分数据以5星为标准 (只包含整星,不能为半星)
  • Timestamp表示从1970.1.1起的秒
  • 每个用户至少有20个评分数据

UserCF原理

基于用户的协同过滤算法.基本思想是针对用户u来说,先根据用户历史行为数据(这里指用户的电影评分数据)找到跟用户u相似的一个用户集,然后对用户u没有评分的电影,使用用户集的行为数据,根据用户u与用户群体中用户的相似度做加权平均,得到一个用户u没有看过电影的评分,根据评分排序,选择topK个电影作为用户u的推荐结果.

实现UserCF主要关注几个点:

  • Users-Items矩阵: 如何根据用户历史行为数据得到这个矩阵;
  • 用户u的相似群体: 用户之间相似定义,评估,给出量化指标;
  • 用户u的推荐电影评分: 相似用户评分的加权平均,权重的定义,赋值

users-items矩阵

通过ratings.dat文件构建users-items矩阵,行表示用户u对所有电影的评分,范围是1-5;如果为0表示用户u还没有看过该电影

用户相似度计算

  • 离散数据:相似度计算公式

  • 这里采用余弦相似度计算公式:两个向量计算相似度

通过用户之间的相似度计算,可以得到一个用户相似度矩阵.

电影评分

对于用户u,

  1. 根据用户相似度矩阵选择topK相似用户,形成集合S;
  2. 集合S中的用户评分过的电影中筛选掉用户u看过的电影,得到候选电影集N;
  3. 用户集合S和候选电影集N,推测用户u对没看过电影j的评分公式为
    • 其中,S(u,K)表示和用户u最相似的topK个用户
    • N(i):表示候选电影集

代码实现

实现效果

  • input: 用户u
  • output: 推荐结果topN列表

流程

为了实现上述的效果,我们需要读入电影数据movies.dat以及用户评分数据ratings.dat.

  • 根据ratings.dat得到users-items矩阵;
  • 使用UserCF得到topN推荐结果列表,内容是ids;
  • 根据topN列表电影id查询movies.dat,得到推荐电影名称

具体参见代码:repo地址

Code References

推荐系统实战(二)–movieslens数据集实现UserCF算法

您的支持就是我更新的最大动力!谢谢!