《推荐系统实践》算法纯享(附代码链接)(五)—— 借助上下文信息推荐篇

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

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

《推荐系统实践》算法纯享(附代码链接)(一)—— 评价指标篇
《推荐系统实践》算法纯享(附代码链接)(二)—— 协同过滤篇
《推荐系统实践》算法纯享(附代码链接)(三)—— 冷启动篇
《推荐系统实践》算法纯享(附代码链接)(四)—— UGC推荐篇
《推荐系统实践》算法纯享(附代码链接)(五)—— 借助上下文信息推荐篇
《推荐系统实践》算法纯享(附代码链接)(六)—— 借助社交网络推荐篇
《推荐系统实践》算法纯享(附代码链接)(七)—— 评分预测篇

完整代码链接:https://github.com/Magic-Bubble/RecommendSystemPractice

下面将开始本系列的第五部分——借助上下文信息推荐篇

5 上下文推荐

上下文的信息一般有时间、地点等。

5.1 时间上下文推荐

代码链接:https://github.com/Magic-Bubble/RecommendSystemPractice/blob/master/Chapter5/基于时间上下文信息的推荐.ipynb

带有时间的用户行为数据集一般由(u, i, t)三元组组成,表示用户u给物品i在时间t由交互的行为。

那么有如下几种方法基于带时间信息的行为进行推荐:

5.1.1 最近最热门

这是一种带时间衰减的非个性化方法。给定时间T,物品i最近的流行度 n i ( T ) n_i(T) ni(T)可以定义为:

n i ( T ) = ∑ ( u , i , t ) ∈ T r a i n , t &lt; T 1 1 + α ( T − t ) n_i(T) = \sum_{(u, i, t)\in Train, t&lt;T} \frac{1}{1+\alpha(T-t)} ni(T)=(u,i,t)Train,t<T1+α(Tt)1

其中 α \alpha α是时间衰减系数。

5.1.2 时间上下文相关的ItemCF算法

前面介绍的ItemCF的算法,主要包含下面两步比较重要的阶段:

  1. 利用用户行为离线计算物品之间的相似度
  2. 根据用户的历史行为和物品相似度矩阵,给用户做个性化推荐

这两步其实都可以加入时间信息。首先回顾不加时间信息的ItemCF算法计算物品相似度的公式:

s i m ( i , j ) = ∑ u ∈ N ( i ) ⋂ N ( j ) 1 ∣ N ( i ) ∣ ∣ N ( j ) ∣ sim(i, j)=\frac{\sum_{u\in{N(i) \bigcap N(j)}}1}{\sqrt{|N(i)||N(j)|}} sim(i,j)=N(i)N(j) uN(i)N(j)1

而在给用户u做推荐时,用户u对物品i的兴趣 p ( u , i ) p(u,i) p(u,i)通过如下公式计算:

p ( u , i ) = ∑ j ∈ N ( u ) s i m ( i , j ) p(u,i)=\sum_{j\in N(u)} sim(i, j) p(u,i)=jN(u)sim(i,j)

在得到时间信息之后,就可以用如下公式改进相似度计算:

s i m ( i , j ) = ∑ u ∈ N ( i ) ⋂ N ( j ) f ( ∣ t u i − t u j ∣ ) ∣ N ( i ) ∣ ∣ N ( j ) ∣ sim(i, j)=\frac{\sum_{u\in{N(i) \bigcap N(j)}} f(|t_{ui}-t_{uj}|)}{\sqrt{|N(i)||N(j)|}} sim(i,j)=N(i)N(j) uN(i)N(j)f(tuituj)

这个式子中引入了和时间相关的衰减项 f ( ∣ t u i − t u j ∣ ) f(|t_{ui}-t_{uj}|) f(tuituj),其中 t u i t_{ui} tui是用户u对物品i产生行为的时间。 f f f函数的含义是,用户对物品i和物品j产生行为的时间越远,则 f ( ∣ t u i − t u j ∣ ) f(|t_{ui}-t_{uj}|) f(tuituj)越小。一般可以使用如下的衰减函数:

f ( ∣ t u i − t u j ∣ ) = 1 1 + α ∣ t u i − t u j ∣ f(|t_{ui}-t_{uj}|)=\frac{1}{1 + \alpha |t_{ui}-t_{uj}|} f(tuituj)=1+αtuituj1

α \alpha α是时间衰减函数,可以自己调节。

同样的,也可以根据时间信息改进预测公式:

p ( u , i ) = ∑ j ∈ N ( u ) s i m ( i , j ) 1 1 + β ∣ t 0 − t u j ∣ p(u,i)=\sum_{j\in N(u)} sim(i, j) \frac{1}{1 + \beta|t_0-t_{uj}|} p(u,i)=jN(u)sim(i,j)1+βt0tuj1

其中 t 0 t_0 t0是当前时间,即 u t j u_{tj} utj越靠近 t 0 t_0 t0,和物品j相似的物品就会在用户u的推荐列表中获得越高的排名, β \beta β是时间衰减参数。

5.1.3 时间上下文相关的UserCF算法

与ItemCF相似,对于UserCF算法也可以加入时间信息进行改进。

首先是用户相似度计算公式,不加时间信息的是:

w u v = ∣ N ( u ) ⋂ N ( v ) ∣ ∣ N ( u ) ∣ ∣ N ( v ) ∣ w_{uv}=\frac{|N(u) \bigcap N(v)|}{\sqrt{|N(u)||N(v)|}} wuv=N(u)N(v) N(u)N(v)

加入时间信息的相似度计算公式如下:

w u v = ∑ i ∈ N ( u ) ⋂ N ( v ) 1 1 + α ∣ t u i − t v i ∣ ∣ N ( u ) ∣ ∣ N ( v ) ∣ w_{uv}=\frac{\sum_{i \in N(u) \bigcap N(v)}\frac{1}{1+\alpha|t_{ui}-t_{vi}|}}{\sqrt{|N(u)||N(v)|}} wuv=N(u)N(v) iN(u)N(v)1+αtuitvi1

同样的,不加时间信息的预测公式如下:

p ( u , i ) = ∑ v ∈ S ( u , K ) w u v r v i p(u,i)=\sum_{v\in S(u, K)} w_{uv}r_{vi} p(u,i)=vS(u,K)wuvrvi

加入时间衰减后的预测公式为:

p ( u , i ) = ∑ v ∈ S ( u , K ) w u v r v i 1 1 + α ∣ t 0 − t v i ∣ p(u,i)=\sum_{v\in S(u, K)} w_{uv}r_{vi} \frac{1}{1 + \alpha|t_0-t_{vi}|} p(u,i)=vS(u,K)wuvrvi1+αt0tvi1

5.1.4 时间段图模型

这里同样可以用图模型进行推荐。在图的构建过程中,需要加入时间信息,即时间段图模型。

时间段图模型 G ( U , S U , I , S I , E , w , σ ) G(U, S_U, I, S_I, E, w, \sigma) G(U,SU,I,SI,E,w,σ)也是一个二分图。 U U U是用户节点集合, S U S_U SU是用户时间段节点集合。一个用户时间段节点 v u t ∈ S U v_{ut}\in S_U vutSU会和用户u在时刻t喜欢的物品通过边相连。 I I I是物品节点集合, S I S_I SI是物品时间段节点集合。一个物品时间段节点 v i t ∈ S I v_{it} \in S_I vitSI会和所有在时刻t喜欢物品i的用户通过边相连。E是边集合,它包含了3种边:(1) 如果用户u对物品i有行为,那么存在边 e ( v u , v i ) ∈ E e(v_u, v_i)\in E e(vu,vi)E;(2)如果用户u在t时刻对物品i有行为,那么就存在两条边 e ( v u t , v i ) e(v_{ut}, v_i) e(vut,vi) e ( v u , v i t ) ∈ E e(v_u, v_{it})\in E e(vu,vit)E w ( e ) w(e) w(e)定义了边的权重, σ ( e ) \sigma(e) σ(e)定义了顶点的权重。

下图就是一个简单的时间段图模型:

在这个图上之间用PersonalRank方法,需要在全图上进行迭代计算,所以时间复杂度比较高。因此可以用一种路径融合算法,来计算图上两个顶点的相关性:

一般来说,图上两个相关性比较高的顶点一般具有如下特征:

  1. 两个顶点之间有很多路径相连;
  2. 两个顶点之间的路径比较短;
  3. 两个顶点之间的路径不经过出度比较大的顶点。

从这3条原则出发,路径融合算法首先提取出两个顶点之间长度小于一个阈值的所有路径,然后根据每条路径经过的顶点给每条路径赋予一定的权重,最后将两个顶点之间所有路径的权重之和作为两个顶点的相关度。

假设 P = v 1 , v 2 , . . . , v n P={v_1, v_2, ..., v_n} P=v1,v2,...,vn是连接顶点 v 1 v_1 v1 v n v_n vn的一条路径,这条路径的权重 Γ \Gamma Γ取决于这条路径经过的所有顶点和边:

Γ ( P ) = σ ( v n ) ∏ i = 1 n − 1 σ ( v i ) ⋅ w ( v i , v i + 1 ) ∣ o u t ( v i ) ∣ ρ \Gamma(P)=\sigma(v_n)\prod_{i=1}^{n-1} \frac{\sigma(v_i)·w(v_i, v_{i+1})}{|out(v_i)|^\rho} Γ(P)=σ(vn)i=1n1out(vi)ρσ(vi)w(vi,vi+1)

这里 o u t ( v ) out(v) out(v)是顶点v指向的顶点集合, ∣ o u t ( v ) ∣ |out(v)| out(v)是顶点v的出度, σ ( v i ) ∈ ( 0 , 1 ] \sigma(v_i) \in (0, 1] σ(vi)(0,1]定义了顶点的权重, w ( v i , v i + 1 ) ∈ ( 0 , 1 ] w(v_i, v_{i+1}) \in (0, 1] w(vi,vi+1)(0,1]定义了边 e ( v i , v i + 1 ) e(v_i, v_{i+1}) e(vi,vi+1)的权重。上面的定义符合上面3条原则的后两条。首先,因为 σ ( v i ) ⋅ w ( v i , v i + 1 ) ∣ o u t ( v i ) ∣ ρ ∈ ( 0 , 1 ) \frac{\sigma(v_i)·w(v_i, v_{i+1})}{|out(v_i)|^\rho} \in (0, 1) out(vi)ρσ(vi)w(vi,vi+1)(0,1),所以路径越长n越大, Γ ( P ) \Gamma(P) Γ(P)就越小。同时,如果路径经过了出度大的顶点v’,那么因为 ∣ o u t ( v ′ ) ∣ |out(v&#x27;)| out(v)比较大,所以 Γ ( P ) \Gamma(P) Γ(P)也会比较小。

在定义了一条路径的权重后,就可以定义顶点之间的相关度。对于顶点v和v’,令 p ( v , v ′ , K ) p(v, v&#x27;, K) p(v,v,K)为这两个顶点间距离小于K的所有路径,那么这两个顶点之间的相关度可以定义为:

d ( v , v ′ ) = ∑ P ∈ P ( v , v ′ , K ) Γ ( P ) d(v, v&#x27;)=\sum_{P \in P(v, v&#x27;, K)}\Gamma(P) d(v,v)=PP(v,v,K)Γ(P)

对于时间段图模型,所有边的权重都定义为1,而顶点的权重 σ ( v ) \sigma(v) σ(v)定义如下:

σ ( v ) = { 1 − α v ∈ U α v ∈ S U 1 − β v ∈ I β v ∈ S I \sigma(v) = \left\{ \begin{array}{rl} 1- \alpha &amp; v \in U \\ \alpha &amp; v \in S_U \\ 1 - \beta &amp; v \in I\\ \beta &amp; v \in S_I \end{array} \right. σ(v)=1αα1ββvUvSUvIvSI

这里, α , β ∈ [ 0 , 1 ] \alpha, \beta \in [0, 1] α,β[0,1]是两个参数,控制了不同顶点的权重。

5.2 地点上下文推荐

地点上下文信息的出现方式有三种:

  1. 用户,用户位置,物品,评分
  2. 用户,物品,物品位置,评分
  3. 用户,用户位置,物品,物品位置,评分

5.2.1 用户、用户位置、物品、评分

对第一种地点信息的数据来说,一般用金字塔模型进行推荐。举个例子:

假设有一个来自中国江苏南京的用户。首先根据所有用户的行为利用某种推荐算法(假设是ItemCF)给他生成推荐列表,然后利用中国用户的行为给他生成第二个推荐列表,以此类推,用中国江苏的用户行为给该用户生成第三个推荐列表,并利用中国江苏南京的用户行为给该用户生成第四个推荐列表。然后,按照一定的权重将这4个推荐列表线性相加,从而得到给该用户的最终推荐列表。如下图所示:

5.2.2 用户、物品、物品位置、评分

对于这种情况来说,首先会忽略物品的位置信息,利用ItemCF算法计算用户u对物品i的兴趣 P ( u , i ) P(u,i) P(u,i),但最终物品i在用户u的推荐列表中的权重定义为:

R e c S c o r e ( u , i ) = P ( u , i ) − T r a v e l P e n a l t y ( u , i ) RecScore(u, i)=P(u,i)-TravelPenalty(u, i) RecScore(u,i)=P(u,i)TravelPenalty(u,i)

T r a v e l P e n a l t y ( u , i ) TravelPenalty(u,i) TravelPenalty(u,i)表示了物品i的位置对用户u的代价。计算 T r a v e l P e n a l t y ( u , i ) TravelPenalty(u,i) TravelPenalty(u,i)的基本思想是对于物品i与用户u之前评分的所有物品的位置计算距离的平均值(或者最小值)。

5.2.3 用户,用户位置,物品,物品位置,评分

这种情况应该保证推荐的物品应该距离用户当前位置比较近,在此基础上再通过用户的历史行为给用户推荐离他近且他会感兴趣的物品。

对于借助上下文信息推荐部分的介绍就到这里,下面将继续分享第六部分——借助社交网络推荐篇

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值