目录
1. 项目框架
1.1 系统模块设计:
1.2 项目系统架构
2. 数据源解析
2.1 数据源信息
- 电影信息 movies.csv
电影ID(MID) | 电影名称(NAME) | 电影描述(DESCRI) | 电影时长(TIMELONG) | 发行时间(ISSUE) | 拍摄时间(SHOOT) | 电影语言(LANGUAGE) | 电影类别(DIRECTOR) | 电影演员(ACTORS) | 电影导演(DIRECTOR) |
---|---|---|---|---|---|---|---|---|---|
1 | Toy Story | - | 81minutes | March 20, 2001 | 1995 | English | Adventure Animation Children Comedy Fantasy |
Tom Hanks Tim Allen … Wallace Shawn |
John Lasseter |
… | … | … | … | … | … | … | … | … | … |
- 用户评分信息 ratings.csv
用户ID(UID) | 电影ID(MID) | 电影评分(SCORE) | 评分时间(TIMESTAMP) |
---|---|---|---|
1 | 31 | 2.5 | 1260759144 |
… | … | … | … |
- 电影标签信息 tags.csv
用户ID(UID) | 电影ID(MID) | 电影标签(TAG) | 标签时间(TIMESTAMP) |
---|---|---|---|
15 | 1995 | dentist | 1193435061 |
… | … | … | … |
2.2 主要数据模型
3. 离线统计模块
3.1 历史热门电影统计
统计所有历史数据中每个电影的评分数量(这里只考虑评分的数量,而不考虑评分的大小。)
# RateMoreMovies 数据结构:mid,count
select mid,count(mid) as count from ratings group by mid
3.2 近期热门电影统计
统计每月的电影评分个数,就代表了电影近期的热门度。
changeDate:对评分时间(TIMESTAMP)使用 SimpleDateFormat 对 Date 进行格式转换,转换格式为 “yyyyMM”。
# ratingOfMonth 数据结构:mid,score,yearmonth
select mid,score,changeDate(timestamp) as yearmonth from ratings
# RateMoreRecentlyMovies 数据结构:mid,count,yearmonth
select mid,count(mid) as count, yearmonth from ratingOfMonth group by yearmonth,mid order by yearmonth desc,count desc
3.3 电影平均评分统计
# AverageMovies 数据结构:mid,avg
select mid,avg(score) as avg from ratings group by mid
3.4 各类别Top10优质电影统计
# movieWithScore 把所有的类别和所有的电影做匹配判断
select a.mid,genres,if(isnull(b.avg),0,b.avg) score from movies a left join averageMovies b on a.mid=b.mid
4. 离线推荐模块
4.1 用ALS算法训练隐语义模型
ALS是交替最小二乘法(alternating least squares)的简称,在机器学习中,ALS特指使用交替最小二乘法求解的一个协同推荐算法。
因子分解类模型的好处在于,一旦建立了模型,对推荐的求解便相对容易。所以这类模型的表现通常都很出色。但弊端可能在于因子数量的选择有一定困难,往往要结合具体业务和数据量来决定。一般来说,因子的取值范围在10~200之间。注意:k越大,其计算复杂度越高
ALS推荐模型训练:
4.2 计算用户推荐矩阵
4.3 计算电影相似度矩阵
两个电影的评分大小并不能体现这两个电影的相似度,因此我们在这里使用余弦相似度来表征两个电影的相似度,而不是用欧氏距离。
存储电影相似度矩阵:
5. 实时推荐模块
- 计算速度要快
- 结果可以不是特别精确
- 有预先设计好的推荐模型
5.1 实时推荐架构
5.2 实时推荐优先级计算
基本原理:用户最近一段时间的口味是相似的。
需要综合考虑 与用户最近看的电影相似的电影 以及 用户对该电影的评分(评分低的话 则不推荐相似电影),对这两个因素进行 加权求和 得到 推荐优先级。
具体做法:
- 首先先获取一组备选电影列表;
- 然后对每一个备选电影去做计算,计算它的推荐优先级;
E u q = ∑ r ∈ R K s i m ( q , r ) × R r s i m n u m + l g m a x ( i n c o u n t , 1 ) − l g m a x ( r e c o u n t , 1 ) E_{uq} = \frac{\sum\limits_{r\in RK} sim(q,r)\times R_r}{sim_num} + lg max(incount, 1) - lg max (recount, 1) Euq=simnumr∈RK∑sim(q,r)×Rr+lgmax(incount,1)−lgmax(recount,1)其中,- sim(q,r) 为 备选电影 q q q 与用户最近看过的电影 r ∈ R K r\in RK r∈RK 之间的相似度;
- R r R_r Rr 表示用户对电影 r r r 的评分;
- ∑ r ∈ R K s i m ( q , r ) × R r s i m n u m \frac{\sum\limits_{r\in RK} sim(q,r)\times R_r}{sim_num} simnumr∈RK∑sim(q,r)×Rr 表示 相似度 与 评分 进行加权求和,再取平均;
- l g m a x ( i n c o u n t , 1 ) lg max(incount, 1) lgmax(incount,1) 表示奖励项, i n c o u n t incount incount 表示用户的最近评分中 高分(自定义)的个数;
- l g m a x ( r e c o u n t , 1 ) lg max(recount, 1) lgmax(recount,1) 表示惩罚项, i n c o u n t incount incount 表示用户的最近评分中 低分(自定义)的个数。
6. 基于内容的推荐模块
- 电影A的相似电影——有相同标签的电影
- Item-CF:根据标签提取电影A的内容特征,选取与A特征相似的电影
- 根据 UGC 的特征提取——TF-IDF
参考:
[1] 尚硅谷机器学习和推荐系统项目实战教程