《推荐系统实践》算法纯享(附代码链接)(七)——评分预测篇

在上一篇博客里面分享的是《推荐系统实践》中社交网络推荐相关的推荐算法,对此还不熟悉的读者可以戳这里

关于这个系列会分为如下几个部分:

《推荐系统实践》算法纯享(附代码链接)(一)—— 评价指标篇
《推荐系统实践》算法纯享(附代码链接)(二)—— 协同过滤篇
《推荐系统实践》算法纯享(附代码链接)(三)—— 冷启动篇
《推荐系统实践》算法纯享(附代码链接)(四)—— 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(ruir^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

最简单的评分预测算法是利用平均值预测用户对物品的评分。

  1. 全局平均值

定义为训练集中所有评分记录的评分平均值:

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

  1. 用户评分平均值

定义为用户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=iN(u)1iN(u)rui

  1. 物品评分平均值

定义为物品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=uN(i)1uN(i)rui

  1. 用户分类对物品分类的平均值

假设有两个分类函数,一个是用户分类函数 ϕ \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种特殊的平均值,在用户评分数据上还可以定义很多不同的分类函数。

  1. 用户和物品的平均分 对于一个用户,可以计算他的评分平均分。然后将所有用户按照评分平均分从小到大排序,并将用户按照平均分平均分成N类。物品也可以用同样的方式分类。
  2. 用户活跃度和物品流行度 对于一个用户,将他评分的物品数量定义为他的活跃度。得到用户活跃度之后,可以将用户通过活跃度从小到大排序,然后平均分为N类。物品的流行度定义为给物品评分的用户数目,物品也可以按照流行度均匀分成N类。

7.1.2 基于邻域的方法

基于用户的邻域算法和基于物品的邻域算法都可以应用到评分预测中。

  1. 基于用户的邻域算法

该算法认为预测一个用户对一个物品的评分,需要参考和这个用户兴趣相似的用户对该物品的评分,即:

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+vS(u,K)N(i)wuvvS(u,K)N(i)wuv(rvirˉ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=iI(ruirˉu)2iI(rvirˉv)2 iI(ruirˉu)(rvirˉv)

  1. 基于物品的邻域算法

该算法在预测用户u对物品i的评分时,会参考用户u对和物品i相似的其他物品的评分,即:

r ^ u i = r ˉ i + ∑ j ∈ S ( i , K ) ⋂ N ( u ) w i j ( r u j − r ˉ i ) ∑ j ∈ S ( i , K ) ⋂ N ( u ) ∣ w i j ∣ \hat r_{ui} = \bar r_i + \frac{\sum_{j \in S(i, K) \bigcap N(u)}w_{ij}(r_{uj}-\bar r_i)}{\sum_{j \in S(i, K) \bigcap N(u)} |w_{ij}|} r^ui=rˉi+jS(i,K)N(u)wijjS(i,K)N(u)wij(rujrˉi)

这里, S ( i , K ) S(i, K) S(i,K)是和i最相似的物品集合, N ( u ) N(u) N(u)是用户u评过分的物品集合, w i j w_{ij} wij是物品之间的相似度, r ˉ i \bar r_i rˉi是物品i的平均分。

至于如何计算物品之间的相似度,有如下三种方式:

a. 余弦相似度

w i j = ∑ u ∈ U r u i ⋅ r u j ∑ u ∈ U r u i 2 ∑ u ∈ U r u j 2 w_{ij} = \frac{\sum_{u \in U} r_{ui} · r_{uj}}{\sqrt{\sum_{u \in U} r^2_{ui} \sum_{u \in U} r^2_{uj}}} wij=uUrui2uUruj2 uUruiruj

b. 皮尔逊系数

w i j = ∑ u ∈ U ( r u i − r ˉ i ) ⋅ ( r u j − r ˉ j ) ∑ u ∈ U ( r u i 2 − r ˉ i ) 2 ∑ u ∈ U ( r u j 2 − r ˉ j ) 2 w_{ij} = \frac{\sum_{u \in U} (r_{ui} - \bar r_i) · (r_{uj} - \bar r_j)}{\sqrt{\sum_{u \in U} (r^2_{ui} - \bar r_i)^2 \sum_{u \in U} (r^2_{uj} - \bar r_j) ^ 2}} wij=uU(rui2rˉi)2uU(ruj2rˉj)2 uU(ruirˉi)(rujrˉj)

c. 被Sarwar称为修正的余弦相似度

w i j = ∑ u ∈ U ( r u i − r ˉ u ) ⋅ ( r u j − r ˉ u ) ∑ u ∈ U ( r u i 2 − r ˉ u ) 2 ∑ u ∈ U ( r u j 2 − r ˉ u ) 2 w_{ij} = \frac{\sum_{u \in U} (r_{ui} - \bar r_u) · (r_{uj} - \bar r_u)}{\sqrt{\sum_{u \in U} (r^2_{ui} - \bar r_u)^2 \sum_{u \in U} (r^2_{uj} - \bar r_u) ^ 2}} wij=uU(rui2rˉu)2uU(ruj2rˉu)2 uU(ruirˉu)(rujrˉu)

7.1.3 隐语义模型及矩阵分解

用户的评分行为可以表示成一个评分矩阵R,其中R[u][i]就是用户u对物品i的评分。但是,用户不会对所有的物品评分,所以这个矩阵里有很多元素都是空的,这些空的元素称为缺失值(missing value)。因此,评分预测从某种意义上说就是填空,如果一个用户对一个物品没有评过分,那么推荐系统就要预测这个用户是否是否会对这个物品评分以及会评几分。

  1. 传统SVD分解

学过矩阵论的读者应该都知道,矩阵分解可以用SVD(奇异值)分解方法。给定m个用户和n个物品,和用户对物品的评分矩阵 R ∈ R m × n R \in \mathbb{R}^{m \times n} RRm×n。首先需要对评分矩阵中的缺失值进行简单地补全,比如用全局平均值,或者用户/物品平均值补全,得到补全后的矩阵R’。接着,可以用SVD分解将 R ′ R' R分解成如下形式:

R ′ = U T S V R' = U^TSV R=UTSV

其中 U ∈ R k × m U \in \mathbb{R}^{k \times m} URk×m V ∈ R k × n V \in \mathbb{R}^{k \times n} VRk×n是两个正交矩阵, S ∈ R k × k S \in \mathbb{R}^{k \times k} SRk×k是对角阵,对角线上的每一个元素都是矩阵的奇异值。为了对 R ′ R' R进行降维,可以取最大的 f f f个奇异值组成对角矩阵 S f S_f Sf,并且找到这 f f f个奇异值中每个值在 U U U V V V矩阵中对应的行和列,得到 U f U_f Uf V f V_f Vf,从而可以得到一个降维后的评分矩阵:

R f ′ = U f T S f V f R'_f = U^T_fS_fV_f Rf=UfTSfVf

其中, R f ′ ( u , i ) R'_f(u, i) Rf(u,i)就是用户u对物品i评分的预测值。

这种早期的方法有如下两个缺点:

a. 该方法首先需要用一个简单的方法补全稀疏评分矩阵,,这种空间的需求在实际系统中是不可能接受的。
b. 该方法依赖的SVD分解方法的计算复杂度很高,特别是在稠密的大规模矩阵上更是非常慢。

  1. Simon Funk的SVD分解

其实就是LFM,针对上面两个问题进行解决,直接将评分矩阵 R R R分解为两个低维矩阵相乘:

R ^ = P T Q \hat R = P^TQ R^=PTQ

其中 P ∈ R f × m P \in \mathbb{R}^{f \times m} PRf×m Q ∈ R f × n Q \in \mathbb{R}^{f \times n} QRf×n是两个降维后的矩阵。那么,对于用户u对物品i的评分的预测值 R ^ ( u , i ) = r ^ u i \hat{R}(u,i)=\hat r_{ui} R^(u,i)=r^ui ,可以通过如下公式计算:

r ^ u i = ∑ f p u f q i f \hat r_{ui} = \sum_f p_{uf}q_{if} r^ui=fpufqif

其中 p u f = P ( u , f ) p_{uf} = P(u, f) puf=P(u,f) q i f = Q ( i , f ) q_{if} = Q(i, f) qif=Q(i,f)。得到这个公式之后,就直接通过训练集中的观察值利用最小化RMSE学习P、Q矩阵,损失函数如下:

C ( p , q ) = ∑ ( u , i ) ∈ T r a i n ( r u i − ∑ f = 1 F p u f q i f ) 2 + λ ( ∣ ∣ p u ∣ ∣ 2 + ∣ ∣ q i ∣ ∣ 2 ) C(p, q) = \sum_{(u, i) \in Train} (r_{ui} - \sum_{f=1}^F p_{uf} q_{if}) ^ 2 + \lambda (||p_u||^2 + ||q_i||^2) C(p,q)=(u,i)Train(ruif=1Fpufqif)2+λ(pu2+qi2)

可以用经典的SGD进行优化,其梯度公式为:

∂ C ∂ p u f = − 2 q i k + 2 λ p u k \frac{\partial C}{\partial p_{uf}} = -2q_{ik} + 2\lambda p_{uk} pufC=2qik+2λpuk

∂ C ∂ p i f = − 2 p u k + 2 λ q i k \frac{\partial C}{\partial p_{if}} = -2p_{uk} + 2\lambda q_{ik} pifC=2puk+2λqik

则优化公式如下,其中 α \alpha α是学习率:

p u f = p u f + α ( q i k − λ p u k ) p_{uf} = p_{uf} + \alpha (q_{ik} - \lambda p_{uk}) puf=puf+α(qikλpuk)

q i f = q i f + α ( p u k − λ q i k ) q_{if} = q_{if} + \alpha (p_{uk} - \lambda q_{ik}) qif=qif+α(pukλqik)

  1. 加入偏置项后的LFM(BiasSVD)

相比于上面的LFM,这里为预测公式加入了偏置项,如下:

r ^ u i = μ + b u + b i + p u T ⋅ q i \hat r_{ui} = \mu + b_u + b_i + p^T_u · q_i r^ui=μ+bu+bi+puTqi

公式中加入了三项偏置, μ \mu μ b u b_u bu b i b_i bi。其中 μ \mu μ是训练集中所有记录的评分的全局平均数,表示网站本身对用户评分的影响; b u b_u bu是用户偏置项,表示用户的评分习惯中和物品没有关系的那种个人因素; b i b_i bi是物品偏置项,表示了物品接受的评分中和用户没有什么关系的因素。

  1. 考虑邻域影响的LFM(SVD++)

可以将之前的ItemCF预测算法改为如下形式:

r ^ u i = 1 ∣ N ( u ) ∣ ∑ j ∈ N ( u ) w i j r u j \hat r_{ui} = \frac{1}{\sqrt{|N(u)|}} \sum_{j \in N(u)} w_{ij} r_{uj} r^ui=N(u) 1jN(u)wijruj

这里, w i j w_{ij} wij不再是根据ItemCF算法计算出的物品相似度矩阵,而是一个和 P P P Q Q Q一样的参数,它可以通过优化如下的损失函数进行优化:

C ( w ) = ∑ ( u , i ) ∈ T r a i n ( r u i − ∑ j ∈ N ( u ) w i j r u j ) 2 + λ w i j 2 C(w) = \sum_{(u, i) \in Train} (r_{ui} - \sum_{j \in N(u)}w_{ij}r_{uj})^2 + \lambda w^2_{ij} C(w)=(u,i)Train(ruijN(u)wijruj)2+λwij2

这个模型有一个缺点,就是w将是一个比较稠密的矩阵,存储它需要比较大的空间。此外,如果有n个物品,那么该模型的参数个数就是 n 2 n^2 n2个,这个参数个数比较大,容易造成结果的过拟合。因此可以对 w w w矩阵也进行分解,将参数个数降低到 2 ∗ n ∗ F 2 * n * F 2nF个,模型如下:

r ^ u i = 1 ∣ N ( u ) ∣ ∑ j ∈ N ( u ) x i T y j = 1 ∣ N ( u ) ∣ x i T ∑ j ∈ N ( u ) y j \hat r_{ui} = \frac{1}{\sqrt{|N(u)|}} \sum_{j \in N(u)} x^T_i y_j = \frac{1}{\sqrt{|N(u)|}} x^T_i \sum_{j \in N(u)} y_j r^ui=N(u) 1jN(u)xiTyj=N(u) 1xiTjN(u)yj

这里, x i x_i xi y j y_j yj是两个F维的向量。由此可见,该模型用 x i T y j x^T_i y_j xiTyj代替了 w i j w_{ij} wij ,从而大大降低了参数的数量和存储空间。

再进一步,可以将前面的LFM和上面的模型相加,从而得到如下模型:

r ^ u i = μ + b u + b i + p u T ⋅ q i + 1 ∣ N ( u ) ∣ x i T ∑ j ∈ N ( u ) y j \hat r_{ui} = \mu + b_u + b_i + p^T_u · q_i + \frac{1}{\sqrt{|N(u)|}} x^T_i \sum_{j \in N(u)} y_j r^ui=μ+bu+bi+puTqi+N(u) 1xiTjN(u)yj

为了防止太多参数造成过拟合,可以令 x = q x = q x=q,这样就得到了最终的SVD++模型:

r ^ u i = μ + b u + b i + q i T ⋅ ( p u + 1 ∣ N ( u ) ∣ ∑ j ∈ N ( u ) y j ) \hat r_{ui} = \mu + b_u + b_i + q^T_i · (p_u + \frac{1}{\sqrt{|N(u)|}} \sum_{j \in N(u)} y_j) r^ui=μ+bu+bi+qiT(pu+N(u) 1jN(u)yj)

7.1.4 加入时间信息

  1. 基于邻域的模型融合时间信息(TItemCF)

通过如下公式预测用户在某一个时刻会给物品什么评分:

r ^ u i t = ∑ j ∈ N ( u ) ⋂ S ( i , K ) f ( w i j , Δ t ) r u j ∑ j ∈ N ( u ) ⋂ S ( i , K ) f ( w i j , Δ t ) \hat r_{uit} = \frac{\sum_{j \in N(u) \bigcap S(i, K)} f(w_{ij}, \Delta t) r_{uj}}{\sum_{j \in N(u) \bigcap S(i, K)} f(w_{ij}, \Delta t)} r^uit=jN(u)S(i,K)f(wij,Δt)jN(u)S(i,K)f(wij,Δt)ruj

其中, Δ t = t u i − t u j \Delta t = t_{ui} - t_{uj} Δt=tuituj是用户u对物品i和物品j评分的时间差, w i j w_{ij} wij是物品i和j的相似度, f ( w i j , Δ t ) f(w_{ij}, \Delta t) f(wij,Δt)是一个考虑了时间衰减后的相似度函数,可以用如下公式:其中的 σ \sigma σ是sigmoid函数。

f ( w i j , Δ t ) = σ ( δ ⋅ w i j ⋅ e x p ( − ∣ Δ t ∣ β ) + γ ) f(w_{ij}, \Delta t) = \sigma (\delta · w_{ij} · exp(\frac{-|\Delta t|}{\beta}) + \gamma) f(wij,Δt)=σ(δwijexp(βΔt)+γ)

可以发现,随着 Δ t \Delta t Δt增加, f ( w i j , Δ t ) f(w_{ij}, \Delta t) f(wij,Δt)会越来越小,也就是说用户很久之前的行为对预测用户当前评分的影响越来越小。

  1. 基于矩阵分解的模型融合时间信息(TSVD)

这里其实就是对(User, Item, Time)三维矩阵进行分解,前面的BiasSVD模型为:

r ^ u i = μ + b u + b i + p u T ⋅ q i \hat r_{ui} = \mu + b_u + b_i + p^T_u · q_i r^ui=μ+bu+bi+puTqi

则加入时间信息的可以变为TSVD:

r ^ u i t = μ + b u + b i + b t + p u T ⋅ q i + x u T ⋅ y t + s i T ⋅ z t + ∑ f g u , f h i , f l t , f \hat r_{uit} = \mu + b_u + b_i + b_t + p^T_u · q_i + x^T_u · y_t + s^T_i · z_t + \sum_f g_{u,f}h_{i,f}l_{t,f} r^uit=μ+bu+bi+bt+puTqi+xuTyt+siTzt+fgu,fhi,flt,f

这里 b t b_t bt建模了系统整体平均分随时间变化的效应, x u T ⋅ y t x^T_u· y_t xuTyt建模了用户平均分随时间变化的效应, s i T z t s^T_iz_t siTzt建模了物品平均分随时间变化的效应,而 ∑ f g u , f h i , f l t , f \sum_f g_{u,f}h_{i,f}l_{t,f} fgu,fhi,flt,f建模了用户兴趣随时间影响的效应。

同样的,对SVD++模型也可以加入时间信息为:

r ^ u i = μ + b u ( t ) + b i ( t ) + q i T ⋅ ( p u ( t ) + 1 ∣ N ( u ) ∣ ∑ j ∈ N ( u ) y j ) \hat r_{ui} = \mu + b_u(t) + b_i(t) + q^T_i · (p_u(t) + \frac{1}{\sqrt{|N(u)|}} \sum_{j \in N(u)} y_j) r^ui=μ+bu(t)+bi(t)+qiT(pu(t)+N(u) 1jN(u)yj)

b u ( t ) = b u + α u ⋅ d e v u ( t ) + b u t + b u , p e r i o d ( t ) b_u(t) = b_u + \alpha_u · dev_u(t) + b_{ut} + b_{u, period(t)} bu(t)=bu+αudevu(t)+but+bu,period(t)

d e v u ( t ) = s i g n ( t − t u ) ⋅ ∣ t − t u ∣ β dev_u(t) = sign(t-t_u)·|t-t_u|^\beta devu(t)=sign(ttu)ttuβ

b i ( t ) = b i + b i t + b i , p e r i o d ( t ) b_i(t) = b_i + b_{it} + b_{i, period(t)} bi(t)=bi+bit+bi,period(t)

p u f ( t ) = p u f + p u t f p_{uf}(t) = p_{uf} + p_{utf} puf(t)=puf+putf

这里, t u t_u tu是用户所有评分的平均时间, p e r i o d ( t ) period(t) period(t)考虑了季节效应,可以定义为时刻t所在的月份。

7.2 模型融合

一般模型融合都是数据比赛最后的大杀器。

7.2.1 级联融合

代码链接:https://github.com/Magic-Bubble/RecommendSystemPractice/blob/master/Chapter8/级联融合评分预测算法.ipynb

这个有点儿像AdaBoost,即每次产生一个新模型,按照一定的参数加到旧模型上去,从而使训练集误差最小化。不同的是,这里每次生成新模型时并不对样本集采样,针对那些预测错的样本,而是每次都还是利用全样本集进行预测,但每次使用的模型都有区别,用来预测上一次的误差,并最后联合在一起预测。

假设已经有一个预测器 r ^ ( k ) \hat r(k) r^(k),对于每个用户—物品对(u, i)都给出预测值,那么可以在这个预测器的基础上设计下一个预测器 r ^ ( k + 1 ) \hat r^(k+1) r^(k+1)来最小化损失函数:

C = ∑ ( u , i ) ∈ T r a i n ( r u i − r ^ u i ( k ) − r ^ u i ( k + 1 ) ) 2 C = \sum_{(u, i) \in Train} (r_{ui} - \hat r ^{(k)}_{ui} - \hat r ^{(k+1)}_{ui}) ^ 2 C=(u,i)Train(ruir^ui(k)r^ui(k+1))2

7.2.2 加权融合

上面那个是串行的,这个就是并行的。假设有K个不同的预测器 r ^ ( 1 ) , r ^ ( 2 ) , . . . , r ^ ( K ) {\hat r^{(1)}, \hat r^{(2)}, ..., \hat r^{(K)}} r^(1),r^(2),...,r^(K),最简单的融合算法是线性融合,即最终的预测器 r ^ \hat r r^是这K个预测器的线性加权:

r ^ = ∑ k = 1 K α k r ^ ( k ) \hat r = \sum_{k=1}^K \alpha_k \hat r^{(k)} r^=k=1Kαkr^(k)

系数的选取一般采用如下方法:

  1. 假设数据集已经被分为了训练集A和测试集B,那么首先需要将训练集A按照相同的分割方法分为A1和A2,其中A2的生成方法和B的生成方法一致,且大小相似。
  2. 在A1上训练K个不同的预测器,在A2上作出预测。因为我们知道A2上的真实评分值,所以可以在A2上利用最小二乘法计算出线性融合系数 α k \alpha_k αk
  3. 在A上训练K个不同的预测器,在B上作出预测,并且将这K个预测器在B上的预测结果按照已经得到的线性融合系数加权融合,以得到最终的预测结果。

除了线性融合,还有很多复杂的融合方法,比如利用人工神经网络的融合算法。

对于评分预测的算法就介绍到这里。

至此,关于算法纯享的部分完全结束!其实《推荐系统实践》这本书中讲了很多关于推荐系统的基础东西,有很多白话描述,因此,如果有对于算法不理解的内容,还是建议去翻阅原书,看作者的描述~

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
# -*- coding: utf-8 -*- import pandas as pd import numpy as np from math import sqrt critics={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5, 'The Night Listener': 3.0}, 'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0, 'You, Me and Dupree': 3.5}, 'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0, 'Superman Returns': 3.5, 'The Night Listener': 4.0}, 'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'Superman Returns': 4.0, 'You, Me and Dupree': 2.5}, 'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0, 'You, Me and Dupree': 2.0}, 'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5}, 'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns':4.0}} df_critics=pd.DataFrame(critics) ##欧氏距离 def sim_distance(prefs,person1,person2): si={} for item in prefs[person1]: if item in prefs[person2]: si[item]=1 if len(si)==0: return 0 sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]]) return 1/(1+sqrt(sum_of_squares)) ##numpy pandas 方法 def sim_distance2(prefs,person1,person2): return 1/(1+np.linalg.norm(prefs[person1]-prefs[person2])) ##皮尔逊相关系数 def sim_pearson(prefs,p1,p2): si={} for item in prefs[p1]: if item in prefs[p2]: si[item]=1 n=len(si) if n==0: return 1 ##对所有偏好求和 sum1=sum([prefs[p1][it] for it in si]) sum2=sum([prefs[p2][it] for it in si]) ##求平方和 sum1Sq=sum([pow(prefs[p1][it]
### 回答1: 基于Movielens的电影评分预测推荐算法实践是指通过分析用户的历史评分数据以及电影的特征信息,来预测用户对未评分电影的评分,并向用户推荐可能感兴趣的电影。 首先,我们需要对Movielens数据集进行预处理,包括数据清洗和特征提取。清洗数据可以去除重复数据、处理缺失值等,确保数据的准确性。然后,我们可以提取出与电影相关的特征信息,如电影类型、演员、导演等,用于后续的算法建模。 接下来,我们可以采用协同过滤算法来进行电影评分预测。协同过滤算法分为基于用户的协同过滤和基于物品的协同过滤。基于用户的协同过滤通过比较用户之间的相似度,预测用户对未评分电影的评分。基于物品的协同过滤则是通过比较电影之间的相似度,预测用户对未评分电影的评分。这些相似度可以使用余弦相似度等方法来计算。我们还可以引入加权评分和时间衰减等策略来提高预测准确性。 另外,我们还可以结合内容过滤算法来进行推荐。内容过滤算法基于电影的特征信息,通过计算用户的偏好和电影的相关性来预测用户对未评分电影的评分。例如,通过计算用户对某个类型电影的偏好,来推荐同类型的未看过的电影。 最后,我们可以使用评价指标如均方根误差(RMSE)来评估模型的性能。通过交叉验证和调参等方法,进一步优化模型的准确性和泛化能力。 总之,基于Movielens的电影评分预测推荐算法实践涉及数据预处理、特征提取、协同过滤和内容过滤等技术,通过分析用户的历史评分和电影的特征信息,来预测用户对未评分电影的评分,并向用户推荐可能感兴趣的电影。 ### 回答2: 基于Movielens的电影评分预测推荐算法实践是指利用用户对电影的历史评分数据,通过建立推荐模型预测用户对未观影电影的评分并进行推荐。下面是实践算法的步骤及方法: 1. 数据处理:首先,需要对Movielens提供的电影评分数据进行预处理。包括去除缺失值、重复值,将评分转化为离散等级(如1-5星)等。 2. 特征提取:从处理后的数据中提取有用的特征,如用户ID、电影ID、评分、电影类型、导演、演员等。这些特征将用于建立推荐模型。 3. 模型选择:根据实际需求和算法性能,选择合适的推荐算法模型。常用的模型包括基于协同过滤的方法(如基于用户的协同过滤、基于物品的协同过滤)和基于内容的推荐方法。 4. 模型训练:使用训练集数据对所选的推荐模型进行训练。根据模型的不同,可以使用不同的训练方法,如矩阵分解、最大似然估计等。 5. 模型评估:使用测试集数据来评估模型的性能。可以使用评价指标如均方根误差(RMSE)和平均绝对误差(MAE)来衡量预测评分的准确度。 6. 预测与推荐:在模型训练和评估完成后,可以利用模型对未观影电影进行评分预测,并根据预测评分进行推荐。推荐方法可以包括基于评分的排序、基于相似度的推荐等。 7. 模型优化:根据实际情况,进一步优化模型的表现。可以通过增加更多的特征、调整模型参数等来提升预测和推荐的准确度。 通过以上步骤和方法,基于Movielens的电影评分预测推荐算法实践可以实现对用户个性化的电影推荐,提升用户体验和电影网站的业务价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值