推荐系统实践读书笔记(五)

第5章 利用上下文信息

上下文信息对于提高推荐系统的各项评测指标是十分重要的,因此不能忽略上下文信息。准确了解用户的上下文信息(context),并将该信息应用于推荐算法是设计好的推荐系统的关键步骤
关于上下文推荐的研究, 可以参考Alexander Tuzhilin(个人主页为http://people.stern.nyu.edu/atuzhili/ )教授的一篇综述“Context Aware Recommender Systems”。

本章主要讨论了时间上下文,并简单介绍一下地点上下文,讨论如何将时间信息和地点信息建模到推荐算法中,从而让推荐系统能够准确预测用户在某个特定时刻及特定地点的兴趣。本章仍然研究TopN推荐,即如何给用户生成一个长度为$N$的推荐列表,而该列表包含了用户在某一时刻或者某个地方最可能喜欢的物品。

5.1 时间上下文信息

本节重点讨论了上下文信息中最重要的时间上下文信息。本节首先介绍了各种不同的时间效应,然后研究如何将这些时间效应建模到推荐系统的模型中,最后通过实际数据集对比不同模型的效果。

5.1.1 时间效应简介

一般认为,时间信息对用户兴趣的影响表现在以下几个方面。

  • 用户兴趣是变化的 这里提到的用户兴趣变化是因为用户自身原因发生的变化,并且考虑用户最近的兴趣只能针对渐变的用户兴趣,而对突变的用户兴趣很难起作用。
  • 物品也是有生命周期的 不同系统的物品具有不同的生命周期。
  • 季节效应 季节效应主要反映了时间本身对用户兴趣的影响。

5.1.2 时间效应举例

这节通过Google Insights工具提供的某个搜索词的搜索频率曲线对时间效应进行一些分析,并且罗列了一些用户兴趣变化及节日效应的例子。

5.1.3 系统时间特性的分析

在给定时间信息后,推荐系统从一个静态系统变成了一个时变的系统,而用户行为数据也变成了时间序列。研究一个时变系统,需要首先研究这个系统的时间特性。

本节通过研究时变 用户行为数据集来研究不同类型网站的时间特性。包含时间信息的用户行为数据集由一系列三元组构成,其中每个三元组$(u,i,t)$代表了用户$u$在时刻$t$对物品$i$产生过行为。在给定数据集后,本节通过统计如下信息研究系统的时间特性。

  • 数据集每天独立用户数的增长情况
  • 系统的物品变化情况
  • 用户访问情况

1.数据集的选择

本节利用Delicious数据集进行离线实验以评测不同算法的预测精度,书中这部分有一些关于Delicious数据集的介绍。

2.物品的生存周期和系统的时效性

不同类型网站的物品具有不同的生命周期。可以使用如下指标度量网站中物品的生命周期。

  • 物品平均在线天数 如果一个物品在某天被至少一个用户产生过行为,就定义该物品在这一天在线。因此,就可以通过物品的平均在线天数度量一类物品的生存周期。
  • 相隔T天系统物品流行度向量的平均相似度 取系统中相邻T天的两天,分别计算这两天的物品流行度,从而得到两个流行度向量。然后,计算这两个向量的余弦相似度,如果相似度大,说明系统的物品在相隔T天的时间内没有发生大的变化,从而说明系统的时效性不强,物品的平均在线时间较长。反之,相似度小则说明时效性很强。

5.1.4 推荐系统的实时性

用户兴趣是不断变化的,其变化体现在用户不断增加的新行为中。一个实时的推荐系统需要能够实时响应用户新的行为,让推荐列表不断变化,从而满足用户不断变化的兴趣。

实现推荐系统的实时性除了对用户行为的存取有实时性要求,还要求推荐算法本身具有实时性,而推荐算法本身的实时性意味着:

  • 实时推荐系统不能每天都给所有用户离线计算推荐结果,然后在线展示昨天计算出来的结果。所以,要求在每个用户访问推荐系统时,都根据用户这个时间点前的行为实时计算推荐列表。
  • 推荐算法需要平衡考虑用户的近期行为和长期行为,即要让推荐列表反应出用户近期行为所体现的兴趣变化,又不能让推荐列表完全受用户近期行为的影响,要保证推荐列表对用户兴趣预测的延续性。

5.1.5 推荐算法的时间多样性

为了避免每天给用户的推荐结果相近,将推荐系统每天推荐结果的变化程度被定义为推荐系统的时间多样性。时间多样性高的推荐系统中用户会经常看到不同的推荐结果。

那么推荐系统的时间多样性和用户满意度之间是否存在关系呢?时间多样性高是否就能提高用户的满意度?为了解答这些问题,英国研究人员进行了一次实验(参见Neal Lathia、Stephen Hailes、Licia Capra和Xavier Amatriain的“Temporal Diversity in Recommender Systems”(SIGIR 2010)),他们设计了3种推荐系统,证明了时间多样性对推荐系统的正面意义,书上有关于这个实验的简略介绍。

之后的问题就是如何在不损失精度的情况下提高推荐结果的时间多样性。
提高推荐结果的时间多样性需要分两步解决:首先,需要保证推荐系统能够在用户有了新的行为后及时调整推荐结果,使推荐结果满足用户最近的兴趣;其次,需要保证推荐系统在用户没有新的行为时也能够经常变化一下结果,具有一定的时间多样性
对于第一步,又可以分成两种情况进行分析。第一是从推荐系统的实时性角度分析。有些推荐系统会每天离线生成针对所有用户的推荐结果,然后在线直接将这些结果展示给用户。这种类型的系统显然无法做到在用户有了新行为后及时调整推荐结果。第二,即使是实时推荐系统,由于使用的算法不同,也具有不同的时间多样性。对于不同算法的时间多样性,Neal Lathia博士在博士论文中进行了深入探讨(参见Neal Lathia的“Evaluating Collaborative Filtering Over Time”, 论文链接为http://www.cs.ucl.ac.uk/staff/n.lathia/thesis.html )。

紧接着需要思考的问题就是如果用户没有行为,如何保证给用户的推荐结果具有一定的时间多样性呢?一般的思路有以下几种。

  • 在生成推荐结果时加入一定的随机性。比如从推荐列表前20个结果中随机挑选10个结果 展示给用户,或者按照推荐物品的权重采样10个结果展示给用户。
  • 记录用户每天看到的推荐结果,然后在每天给用户进行推荐时,对他前几天看到过很多次的推荐结果进行适当地降权。
  • 每天给用户使用不同的推荐算法。

当然,时间多样性也不是绝对的。推荐系统需要首先保证推荐的精度,在此基础上适当地考虑时间多样性。在实际应用中需要通过多次的实验才能知道什么程度的时间多样性对系统是最好的。

5.1.6 时间上下文推荐算法

上一节介绍了很多时间效应,本节主要讨论如何将这些时间效应应用到系统中。建模时间信息有很多方法,本节分别介绍了不同的方法,并通过实验对比这些方法。

1.最近热门

在没有时间信息的数据集中,可以给用户推荐历史上最热门的物品。在获得用户行为的时间信息后,就可以给用户推荐最近最热门的物品了。给定时间$T$,物品$i$最近的流行度$n_i(T)$可以定义为:
$$
n_i(T) = \sum_{(u,i,t) \in \text{Train}, t<T} \frac{1}{1 + \alpha(T-t)}
$$
$\alpha$是时间衰减参数。
下面的Python代码实现了上面的计算公式。

1
2
3
4
5
6
7
def RecentPopularity(records, alpha, T):
ret = dict()
for user,item,tm in records:
if tm >= T:
continue
addToDict(ret, item, 1 / (1.0 + alpha * (T - tm)))
return ret

2.时间上下文相关的ItemCF算法

基于物品(item-based)的个性化推荐算法是商用推荐系统中应用最广泛的,从前面几章的讨论可以看到,该算法由两个核心部分构成:

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

时间信息在上面两个核心部分中都有重要的应用,这体现在两种时间效应上。

  • 物品相似度 用户在相隔很短的时间内喜欢的物品具有更高相似度。
  • 在线推荐 用户近期行为相比用户很久之前的行为,更能体现用户现在的兴趣。因此在预测用户现在的兴趣时,应该加重用户近期行为的权重,优先给用户推荐那些和他近期喜欢的物品相似的物品。

首先回顾一下前面提到的基于物品的协同过滤算法,它通过如下公式计算物品的相似度:
$$
sim(i,j) = \frac{\sum_{u \in N(i) \cap N(j)}1}{\sqrt{\vert N(i) \vert \vert N(j)\vert}}
$$
而在给用户$u$做推荐时,用户$u$对物品$i$的兴趣$p(u,i)$通过如下公式计算:
$$
p(u,i) = \sum_{j \in N(u)} sim(i,j)
$$
在得到时间信息(用户对物品产生行为的时间)后,可以通过如下公式改进相似度计算:
$$
sim(i,j) = \frac{\sum_{u \in N(i)\cap N(j)} f(\vert t_{ui} - t_{uj} \vert)}{\sqrt{\vert N(i) \vert \vert N(j) \vert}}
$$
注意,上面的公式在分子中引入了和时间有关的衰减项$f(\vert t_{ui} - t_{uj} \vert)$,其中$t_{ui}$是用户$u$对物品$i$产生行为的时间。$f$函数的含义是,用户对物品$i$和物品$j$产生行为的时间越远,则$f(\vert t_{ui} - t_{uj} \vert)$越小。实际上有很多数学衰减函数,本节使用如下衰减函数:
$$
f(\vert t_{ui} - t_{uj} \vert)=\frac{1}{1 + \alpha \vert t_{ui} - t_{uj} \vert}
$$
$\alpha$是时间衰减参数,它的取指在不同系统中不同。如果一个系统用户兴趣变化很快,就应该 取比较大的$\alpha$,反之需要取比较小的$\alpha$。

改进后ItemCF的相似度可以通过如下代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def ItemSimilarity(train, alpha):
#calculate co-rated users between items
C = dict()
N = dict()
for u, items in train.items():
for i,tui in items.items():
N[i] += 1
for j,tuj in items.items():
if i == j:
continue
C[i][j] += 1 / (1 + alpha * abs(tui - tuj))

#calculate finial similarity matrix W
W = dict()
for i,related_items in C.items():
for j, cij in related_items.items():
W[u][v] = cij / math.sqrt(N[i] * N[j])
return W

除了考虑时间信息对相关表的影响,也应该考虑时间信息对预测公式的影响。一般来说, 用户现在的行为应该和用户最近的行为关系更大。因此,可以通过如下方式修正预测公式:
$$
p(u,i) = \sum_{j \in N(u) \cap S(i,k)} sim(i,j) \frac{1}{1+ \beta \vert t_0 - t_{uj} \vert}
$$
其中,$t_0$是当前时间。上面的公式表明,$t_{uj}$越靠近$t_0$,和物品$j$相似的物品就会在用户$u$的推荐列表中获得越高的排名。$\beta$是时间衰减参数,需要根据不同的数据集选择合适的值。上面的推荐算法可以通过如下代码实现。

1
2
3
4
5
6
7
8
def Recommendation(train, user_id, W, K, t0):
rank = dict() ru = train[user_id]
for i,pi in ru.items():
for j, wj in sorted(W[i].items(), \ key=itemgetter(1), reverse=True)[0:K]:
if j,tuj in ru.items():
continue
rank[j] += pi * wj / (1 + alpha * (t0 - tuj))
return rank

3.时间上下文相关的UserCF算法

和ItemCF算法一样,UserCF算法同样可以利用时间信息提高预测的准确率。首先,回顾一下前面关于UserCF算法的基本思想:给用户推荐和他兴趣相似的其他用户喜欢的物品。从这个基本思想出发,可以在以下两个方面利用时间信息改进UserCF算法。

  • 用户兴趣相似度 如果两个用户同时喜欢相同的物品,那么 这两个用户应该有更大的兴趣相似度。
  • 相似兴趣用户的最近行为 应该给用户推荐和他兴趣相似的用户最近喜欢的物品。

回顾一下UserCF的推荐公式。UserCF通过如下公式计算用户$u$和用户$v$的兴趣相似度:
$$
w_{uv} = \frac{\vert N(u) \cap N(v) \vert}{\sqrt{\vert N(u) \vert \cup \vert N(u) \vert}}
$$
其中$N(u)$是用户$u$喜欢的物品集合,$N(v)$是用户$v$喜欢的物品集合。可以利用如下方式考虑时间信息:
$$
w_{uv} = \frac{\sum_{i \in N(u) \cap N(v)} \frac{1}{1 +\alpha \vert t_{ui} - t_{vi} \vert}}{\sqrt{\vert N(u) \vert \cup \vert N(u) \vert}}
$$
上面公式的分子对于用户$u$和用户$v$共同喜欢的物品$i$增加了一个时间衰减因子。用户$u$和用户$v$对物品$i$产生行为的时间越远,那么这两个用户的兴趣相似度就会越小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def UserSimilarity(train):
# build inverse table for item_users
item_users = dict()
for u, items in train.items():
for i,tui in items.items():
if i not in item_users:
item_users[i] = dict()
item_users[i][u] = tui

#calculate co-rated items between users
C = dict()
N = dict()
for i, users in item_users.items():
for u,tui in users.items():
N[u] += 1
for v,tvi in users.items():
if u == v:
continue
C[u][v] += 1 / (1 + alpha * abs(tui - tvi))

#calculate finial similarity matrix W
W = dict()
for u, related_users in C.items():
for v, cuv in related_users.items():
W[u][v] = cuv / math.sqrt(N[u] * N[v])
return W

在得到用户相似度后,UserCF通过如下公式预测用户对物品的兴趣:
$$
p(u,i) = \sum_{v \in S(u,K)} w_{uv} r_{vi}
$$
其中,$S(u,K)$包含了和用户$u$兴趣最接近的$K$个用户。如果用户$v$对物品$i$产生过行为,那么$r_{vi}=1$,否则$r_{vi} = 0$。

如果考虑和用户$u$兴趣相似用户的最近兴趣,可以设计如下公式:
$$
p(u,i) = \sum_{v \in S(u,K)} w_{uv} r_{vi} \frac{1}{1 + \alpha(t_0 + t_{vi})}
$$

1
2
3
4
5
6
7
8
9
10
def Recommend(user, T, train, W):
rank = dict()
interacted_items = train[user]
for v, wuv in sorted(W[u].items, key=itemgetter(1), reverse=True)[0:K]:
for i, tvi in train[v].items:
if i in interacted_items:
#we should filter items user interacted before
continue
rank[i] += wuv / (1 + alpha * (T - tvi))
return rank

5.1.7 时间段图模型

本书的作者在KDD会议上曾经提出过一个时间段图模型(参见Liang Xiang、Quan Yuan、Shiwan Zhao、Li Chen、Xiatian Zhang、Qing Yang和Jimeng Sun的“Temporal recommendation on graphs via long- and short-term preference fusion”(ACM 2010 Article,2010)),试图解决如何将时间信息建模到图模型中的方法,最终取得了不错的效果。
时间段图模型$G (U , S_U , I , S_I , E , w,\sigma )$也是一个二分图。$U$是用户节点集合,$S_U$是用户时间段节点集合。一个用户时间段节点$v_{ut} \in S_U$会和用户$u$在时刻$t$喜欢的物品通过边相连。$I$是物品节点集合,$S_I$是物品时间段节点集合。一个物品时间段节点 $v_{it} \in S_I$会和所有在时刻$t$喜欢物品$i$的用户通过边相连。$E$是边集合,它包含了3种边:(1)如果用户$u$对物品$i$有行为,那么存在边$e(v_u,v_i) \in E$;(2)如果用户$u$在$t$时刻对物品$i$有行为,那么就存在两条边$e(v_{ut},v_i )$, $e(v_u, v_{it} ) \in E$。$w(e)$定义了边的权重,$\sigma (e)$定义了顶点的权重。

定义完图的结构后,最简单的想法是可以利用前面提到的PersonalRank算法给用户进行个性化推荐。但是因为这个算法需要在全图上进行迭代计算,所以时间复杂度比较高。因此作者提出了一种称为路径融合算法的方法,通过该算法来度量图上两个顶点的相关性。
一般来说,图上两个相关性比较高的顶点一般具有如下特征:

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

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

假设$P={v_1,v_2,···,v_N}$是连接顶点$v_1$和$v_n$的一条路径,这条路径的权重$\Gamma(P)$取决于这条路径经过的所有顶点和边:
$$
\Gamma(p) = \sigma(v_n) \prod_{i=1}^{n-1} \frac{\sigma (v_i) \cdot w(v_I,v_{i+1})}{\vert out(v_i) \vert^\rho}
$$
这里$out(v)$是顶点$v$指向的顶点集合,$|out(v)|$是顶点$v$的出度,$\sigma(v_i) \in (0,1]$定义了顶点的权重,$w(v_i,v_{i+1})$定义了边$e(v_i,v_{i+1})$的权重。上面的定义符合上面3条原则的后两条。首先,因为$\frac{\sigma(v_i) \cdot w(v_i,v_{i+1})}{\vert out(v_i)\vert^\rho}$,所以路径越长$n$越大,$\Gamma(P)$就越小。同时,如果路径经过了出度大的顶点v’,那么因为$|out(v’)|$比较大,所以$\Gamma(p)$也会比较小。

在定义了一条路径的权重后,就可以定义顶点之间的相关度。对于顶点$v$和$v’$,令$p(v, v’, K )$为这两个顶点间距离小于K的所有路径,那么这两个顶点之间的相关度可以定义为:
$$
d(v,v’) = \sum_{P \in P(v,v’,K)} \Gamma(P)
$$
对于时间段图模型,所有边的权重都定义为1,而顶点的权重$\sigma(v)$定义如下:
$$
\sigma(v) =
\begin{cases}
1- \alpha &(v \in U) \\
\alpha &(v \in S_U) \\
1 - \beta & (v \in I) \\
\beta & (v \in S_I)
\end{cases}
$$
$\alpha,\beta \in [0,1]$是两个参数,控制了不同顶点的权重。

路径融合算法可以基于图上的广度优先搜索算法实现,下面的Python代码简单实现了路径融合算法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def PathFusion(user, time,G,alpha)
Q = []
V = set()
depth = dict()
rank = dict()
depth['u:' + user] = 0
depth['ut:' + user + '_' + time] = 0
rank ['u:' + user] = alpha
rank ['ut:' + user + '_' + time] = 1 - alpha
Q.append('u:' + user)
Q.append('ut:' + user + '_' + time)
while len(Q) > 0:
v = Q.pop()
if v in V:
continue
if depth[v] > 3:
continue
for v2,w in G[v].items():
if v2 not in V:
depth[v2] = depth[v] + 1
Q.append(v2)
rank[v2] = rank[v] * w
return rank

5.1.8 离线实验

为了证明时间上下文信息对推荐系统至关重要,本节利用了离线实验对比使用时间信息后不同推荐算法的离线性能,感兴趣的看一下书。

5.2 地点上下文信息

除了时间,地点作为一种重要的空间特征,也是一种重要的上下文信息。不同地区的用户兴趣有所不同,用户到了不同的地方,兴趣也会有所不同。

西班牙电信的研究人员曾经设计过一个基于位置的电影推荐系统,并且提供了详细的技术报告(参见“Geolocated Recommendations”,地址为http://xavier.amatriain.net/pubs/GeolocatedRecommendations.pdf )。该报告详细地介绍了如何在iPhone上开发一个推荐系统,如何在电影推荐中融入用户的位置信息,感兴趣的读者可以仔细阅读他们的报告。

基于位置的推荐算法

明尼苏达大学的研究人员提出过一个称为LARS(Location Aware Recommender System,位置感知推荐系统)的和用户地点相关的推荐系统。该系统首先将物品分成两类,一类是有空间属性的,比如餐馆、商店、旅游景点等,另一类是无空间属性的物品,比如图书和电影等。同时,它将用户也分成两类,一类是有空间属性的,比如给出了用户现在的地址(国家、城市、邮编等), 另一类用户并没有相关的空间属性信息。它使用的数据集有3种不同的形式。

  • (用户,用户位置,物品,评分),每一条记录代表了某一个地点的用户对物品的评分。它们使用的是MovieLens数据集。该数据集给出了用户的邮编,从而可以知道用户的大致地址。
  • (用户,物品,物品位置,评分),每一条记录代表了用户对某个地方的物品的评分。LARS使用了FourSquare的数据集,该数据集包含用户对不同地方的餐馆、景点、商店的评分
  • (用户,用户位置,物品,物品位置,评分),每一条记录代表了某个位置的用户对某个位置的物品的评分。

LARS通过研究前两种数据集,发现了用户兴趣和地点相关的两种特征。

  • 兴趣本地化 不同地方的用户兴趣存在着很大的差别。不同国家和地区用户的兴趣存在着一定的差异性。
  • 活动本地化 一个用户往往在附近的地区活动。通过分析Foursqure的数据,研究人员发现45%的用户其活动范围半径不超过10英里,而75%的用户活动半径不超过50英里。

对于第一种数据集,LARS的基本思想是将数据集根据用户的位置划分成很多子集。因为位置信息是一个树状结构,比如国家、省、市、县的结构。因此,数据集也会划分成一个树状结构。然后,给定每一个用户的位置,可以将他分配到某一个叶子节点中,而该叶子节点包含了所有和他同一个位置的用户的行为数据集。然后,LARS就利用这个叶子节点上的用户行为数据,通过ItemCF给用户进行推荐。

不过这样做的缺点是,每个叶子节点上的用户数量可能很少,因此他们的行为数据可能过于稀疏,从而无法训练出一个好的推荐算法。为此,我们可以从根节点出发,在到叶子节点的过程中,利用每个中间节点上的数据训练出一个推荐模型,然后给用户生成推荐列表。而最终的推荐结果是这一系列推荐列表的加权。文章的作者将这种算法成为金字塔模型,而金字塔的深度影响了推荐系统的性能,因而深度是这个算法的一个重要指标。下文用LARS-U代表该算法,书中有关于该算法的简单例子。

对于第二种数据集,每条用户行为表示为四元组(用户、物品、物品位置、评分),表示了用户对某个位置的物品给了某种评分。对于这种数据集,LARS会首先忽略物品的位置信息,利用ItemCF算法计算用户$u$对物品$i$的兴趣$P(u,i)$,但最终物品$i$在用户$u$的推荐列表中的权重定义为:
$$
RecScore(u,i) = P(u,i) - TravelPenalty(u,i)
$$
在该公式中,$TravelPenalty(u,i)$表示了物品$i$的位置对用户$u$的代价。 计算 $TravelPenalty(u,i)$的基本思想是对于物品$i$与用户$u$之前评分的所有物品的位置计算距离的平均值 (或者最小值)。关于如何度量地图上两点的距离,最简单的是基于欧式距离(参见Gísli R. Hjaltason和Hanan Samet的“Distance browsing in spatial databases”(ACM 1999 Article,1999))。当然,欧式距离有明显的缺点,因为人们是不可能沿着地图上的直线距离从一点走到另一点的。比较好的度量方式是利用交通网络数据,将人们实际需要走的最短距离作为距离度量(参见Jie Bao、Chi-Yin Chow、Mohamed F. Mokbel和Wei-Shinn Ku的“Efficient Evaluation of k-Range Nearest Neighbor Queries in Road Networks”(MDM,2012))。

为了避免计算用户对所有物品的$TravelPenalty$,LARS在计算用户$u$对物品$i$的兴趣度$RecScore(u,i)$时,首先对用户每一个曾经评过分的物品(一般是餐馆、商店、景点),找到和他距离小于一个阈值$d$的所有其他物品,然后将这些物品的集合作为候选集,然后再利用上面的公式计算最终的$RecScore$。

对于第三种数据集,LARS一文没有做深入讨论。不过,从第三种数据集的定义可以看到, 它相对于第二种数据集增加了用户当前位置这一信息。而在给定了这一信息后,应该保证推荐的物品应该距离用户当前位置比较近,在此基础上再通过用户的历史行为给用户推荐离他近且他会感兴趣的物品。

为了证明兴趣本地化和活动本地化两种效应,论文作者在FourSquare和MovieLens两个数据集上进行了离线实验。论文作者使用TopN推荐的Precision作为评测指标。

作者首先在FourSquare数据集上对比了ItemCF算法和考虑了TravelPenalty之后的算法(简称为LARS-T)。结果证明考虑TravelPenality确实能够提高TopN推荐的离线准确率,LARS-T算法明显优于ItemCF算法。

然后,作者在FourSquare数据集和MovieLens数据集上对比了普通的ItemCF算法和考虑用户位置的金字塔模型后的LARS-U算法。同时,作者对比了不同深度对LARS-U算法的影响。实验表明,选择合适的深度对LARS-U算法很重要,不过在绝大多数深度的选择下,LARS-U算法在两个数据集上都优于普通的ItemCF算法。

5.3 扩展阅读

时间上下文信息在Netflix Prize中得到了广泛关注,很多参赛者都研究了如何利用这一信息。这方面最著名的文章无疑是Koren的“collaborative filtering with temporal dynamics”,该文系统地总结了各种使用时间信息的方式,包括考虑用户近期行为的影响,考虑时间的周期性等。

英国剑桥大学的Neal Lathia在读博士期间对时间上下文信息以及推荐系统的时间效应进行了深入研究。他在“Temporal Diversity in Recommender Systems”一文中深入分析了时间多样性对推荐系统的影响。他的博士论文“Evaluating Collaborative Filtering Over Time”论述了各种不同推荐算法是如何随时间演化的。

如果要系统地研究与上下文推荐相关的工作, 可以参考Alexander Tuzhili 教授的工作(http://pages.stern.nyu.edu/~atuzhili/ ),他在最近几年和学生对上下文推荐问题进行了深入研究。