在上一篇博客里面分享的是《推荐系统实践》中社交网络推荐相关的推荐算法,对此还不熟悉的读者可以戳这里。
关于这个系列会分为如下几个部分:
《推荐系统实践》算法纯享(附代码链接)(一)—— 评价指标篇
《推荐系统实践》算法纯享(附代码链接)(二)—— 协同过滤篇
《推荐系统实践》算法纯享(附代码链接)(三)—— 冷启动篇
《推荐系统实践》算法纯享(附代码链接)(四)—— UGC推荐篇
《推荐系统实践》算法纯享(附代码链接)(五)—— 借助上下文信息推荐篇
《推荐系统实践》算法纯享(附代码链接)(六)—— 借助社交网络推荐篇
《推荐系统实践》算法纯享(附代码链接)(七)—— 评分预测篇
完整代码链接:https://github.com/Magic-Bubble/RecommendSystemPractice
下面将开始本系列的第七部分——评分预测篇。
文章目录
7 评分预测
前面的推荐算法都是给用户推荐TopN物品的算法,而也有一部分推荐会把问题转化为评分预测问题,即预测用户会给物品打多少分。
一般采用RMSE度量预测的精度,即均方根误差:
R M S E = ∑ ( u , i ) ∈ T ( r u i − r ^ u i ) 2 ∣ T e s t ∣ RMSE = \frac{\sqrt{\sum_{(u,i)\in T}(r_{ui}-\hat r_{ui})^2}}{|Test|} RMSE=∣Test∣∑(u,i)∈T(rui−r^ui)2
其中 r u i r_{ui} rui为预测的用户u对物品i的评分, r ^ u i \hat r_{ui} r^ui为实际的用户u对物品i的评分。
7.1 评分预测算法
7.1.1 平均值
代码链接:https://github.com/Magic-Bubble/RecommendSystemPractice/blob/master/Chapter8/评分预测算法.ipynb
最简单的评分预测算法是利用平均值预测用户对物品的评分。
- 全局平均值
定义为训练集中所有评分记录的评分平均值:
r ^ u i = μ = ∑ ( u , i ) ∈ T r a i n r u i ∑ ( u , i ) ∈ T r a i n 1 \hat r_{ui} = \mu = \frac{\sum_{(u,i)\in Train}r_{ui}}{\sum_{(u,i)\in Train}1} r^ui=μ=∑(u,i)∈Train1∑(u,i)∈Trainrui
- 用户评分平均值
定义为用户u在训练集中所有评分的平均值:
r ^ u i = r ˉ u = ∑ i ∈ N ( u ) r u i ∑ i ∈ N ( u ) 1 \hat r_{ui} = \bar r_{u} = \frac{\sum_{i\in N(u)}r_{ui}}{\sum_{i \in N(u)}1} r^ui=rˉu=∑i∈N(u)1∑i∈N(u)rui
- 物品评分平均值
定义为物品i在训练集中所有评分的平均值:
r ^ u i = r ˉ i = ∑ u ∈ N ( i ) r u i ∑ u ∈ N ( i ) 1 \hat r_{ui} = \bar r_{i} = \frac{\sum_{u\in N(i)}r_{ui}}{\sum_{u \in N(i)}1} r^ui=rˉi=∑u∈N(i)1∑u∈N(i)rui
- 用户分类对物品分类的平均值
假设有两个分类函数,一个是用户分类函数 ϕ \phi ϕ ,一个是物品分类函数 ψ \psi ψ。 ϕ ( u ) \phi(u) ϕ(u) 定义了用户u所属的类, ψ ( i ) \psi(i) ψ(i)定义了物品i所属的类。则可以利用训练集中同类用户对同类物品评分的平均值预测用户对物品的评分,即:
r ^ u i = ∑ ( v , j ) ∈ T r a i n , ϕ ( u ) = ψ ( v ) , ϕ ( i ) = ψ ( j ) r v j ∑ ( v , j ) ∈ T r a i n , ϕ ( u ) = ψ ( v ) , ϕ ( i ) = ψ ( j ) 1 \hat r_{ui} = \frac{\sum_{(v,j)\in Train, \phi(u)=\psi(v), \phi(i)=\psi(j)}r_{vj}}{\sum_{(v,j)\in Train, \phi(u)=\psi(v), \phi(i)=\psi(j)}1} r^ui=∑(v,j)∈Train,ϕ(u)=ψ(v),ϕ(i)=ψ(j)1∑(v,j)∈Train,ϕ(u)=ψ(v),ϕ(i)=ψ(j)rvj
其实前面所有的平均值都是这种类类平均值的特例。除了这3种特殊的平均值,在用户评分数据上还可以定义很多不同的分类函数。
- 用户和物品的平均分 对于一个用户,可以计算他的评分平均分。然后将所有用户按照评分平均分从小到大排序,并将用户按照平均分平均分成N类。物品也可以用同样的方式分类。
- 用户活跃度和物品流行度 对于一个用户,将他评分的物品数量定义为他的活跃度。得到用户活跃度之后,可以将用户通过活跃度从小到大排序,然后平均分为N类。物品的流行度定义为给物品评分的用户数目,物品也可以按照流行度均匀分成N类。
7.1.2 基于邻域的方法
基于用户的邻域算法和基于物品的邻域算法都可以应用到评分预测中。
- 基于用户的邻域算法
该算法认为预测一个用户对一个物品的评分,需要参考和这个用户兴趣相似的用户对该物品的评分,即:
r ^ u i = r ˉ u + ∑ v ∈ S ( u , K ) ⋂ N ( i ) w u v ( r v i − r ˉ v ) ∑ v ∈ S ( u , K ) ⋂ N ( i ) ∣ w u v ∣ \hat r_{ui} = \bar r_u + \frac{\sum_{v \in S(u, K) \bigcap N(i)}w_{uv}(r_{vi}-\bar r_v)}{\sum_{v \in S(u, K) \bigcap N(i)} |w_{uv}|} r^ui=rˉu+∑v∈S(u,K)⋂N(i)∣wuv∣∑v∈S(u,K)⋂N(i)wuv(rvi−rˉv)
这里, S ( u , K ) S(u, K) S(u,K)是和用户u兴趣最相似的K个用户的集合, N ( i ) N(i) N(i)是对物品i评过分的用户集合, r v i r_{vi} rvi是用户v对物品i的评分, r ˉ v \bar r_v rˉv是用户v对他评过分的所有物品评分的平均值。
用户之间的相似度 w u v w_{uv} wuv可以通过皮尔逊系数计算:
w u v = ∑ i ∈ I ( r u i − r ˉ u ) ⋅ ( r v i − r ˉ v ) ∑ i ∈ I ( r u i − r ˉ u ) 2 ∑ i ∈ I ( r v i − r ˉ v ) 2 w_{uv} = \frac{\sum_{i \in I} (r_{ui} - \bar r_u) · (r_{vi} - \bar r_v)}{\sqrt{\sum_{i \in I}(r_{ui}-\bar r_u)^2 \sum_{i \in I}(r_{vi}-\bar r_v)^2}} wuv=∑i∈I(rui−rˉu)2∑i∈I(rvi−rˉv)2∑i∈I