基于用户的协同过滤的原理及其实现.使用数据来自MoviesLens.之后行为结构,先介绍MoviesLens数据集,然后介绍基于用户的协同过滤UserCF算法原理,最后使用MoviesLens数据集实现一个简单的电影推荐系统.
MoviesLens数据集
MovieLens数据集包含多个用户对多部电影的评分数据,也包括电影元数据信息和用户属性信息。这里使用ml-1m数据,解压后有4个文件:movies.dat, users.dat, ratings.dat以及README介绍文件.
movies.dat是电影数据信息文件,表明每个电影的信息,每行数据格式为:
MovieID::Title::Genres
# 电影编号::电影标题::电影分类
users.dat是用户信息文件,包含用户的ID,性别,年龄,职业,邮编地址
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是用户对电影评分数据文件.每行数据格式为:
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,
- 根据用户相似度矩阵选择topK相似用户,形成集合S;
- 集合S中的用户评分过的电影中筛选掉用户u看过的电影,得到候选电影集N;
- 用户集合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地址
网友评论