第一章 好的推荐系统
1.1 什么是推荐系统:
推荐系统的任务就是联系用户和信息:
- 一方面帮助用户发现对自己 有价值的信息,
- 另一方面让信息能够展现在对它感兴趣的用户面前,从而实现信息消费者和信息 生产者的双赢
和搜索引擎一样,推荐系统也是一种帮助用户快速发现有用信息的工具。
推荐系统可以更好地发掘物品的长尾(long tail)。
如下方式决定最终看什么电影:
- 向朋友咨询-称为社会化推荐(social recommendation);
- 基于内容的推荐,eg.根据喜欢的导演和演员;
- 基于协同过滤:找到和自己历史兴趣相似的用户;
- 基于物品的推荐算法;
1.2 个性化推荐系统的应用:
- 电子商务;
- 电影和视频网站;
- 个性化音乐网络电台;
- 社交网络;
- 个性化阅读;
- 基于位置的服务;
- 个性化邮件;
- 个性化广告;
第二章 利用用户行为数据
起初就让用户告诉自己兴趣的三个缺点:
- 现在的自然语言理解技术很难理解用户用来描述兴趣的自然语言;
- 用户的兴趣是不断变化的,但用户不会不停地更新兴趣描述;
- 很多时候用户并不知道自己喜欢什么,或者很难用语言描述自己喜欢什么
购物车分析:
啤酒和尿布的故事,从用户行为数据中可以挖掘,不那么显而易见的规律。找出类似“购买A商品的用户都购买B商品”这种规律。
基于用户行为分析的推荐算法,即协同过滤算法。顾名思义,协同过滤就是指用户可以齐心协力,通过不断地和网站互动,使自己的推荐列表能够不断过滤掉自己不感兴趣的物品,从而越来越满足自己的需求。
2.1 用户行为数据简介:
用户行为数据:原始日志->会话日志->展示日志->点击日志
用户行为分类:
- 显性反馈信息,标记喜欢或不喜欢;
- 隐性反馈信息;页面浏览行为;
显性和隐性数据比较:
显性和隐性数据示例:
用户行为的统一标识:
2.2 用户行为分析:
用户活跃度和物品流行度的分布:
f
u
(
k
)
f_u(k)
fu(k)为对
k
k
k个物品产生过行为的用户数,
f
i
(
k
)
f_i(k)
fi(k)被
k
k
k个用户产生过行为的物品数。
f
u
(
k
)
f_u(k)
fu(k)和
f
i
(
k
)
f_i(k)
fi(k)都满足长尾分布。
用户活跃度和物品流行度的关系:
不活跃用户:要么是新用户,要么是只来过网站一两次的老用户。
- 新用户倾向于浏览热门的物品,因为他们对网站还不熟悉只能点击首页的热门物品;
- 而老用户会逐渐开始浏览冷门的物品;
用户越活跃,越倾向于浏览冷门的物品
协同过滤算法:
- 基于邻域的方法(neighborhood-based);
- 基于用户的协同过滤;
- 基于物品的协同过滤;
- 隐语义模型 (latent factor model);
- 基于图的随机游走算法(random walk on graph)
2.3 实验设计和算法评测
数据集:MovieLens;
数据量:100w条,6000多用户,4000多电影;
数据划分方法:M折交叉验证;
评测指标:Recall,precision,覆盖率;
覆盖率:终的推荐列表中包含多大比例的物品;
2.4 基于邻域的算法:
基于用户的协同过滤算法:
步骤:
- 找到相似的用户集合;
- 找到相似用户喜欢的,切没点击过的物品;
计算相似度:
- 向量表征方式:
- 找到用户 u u u对应的物品集合;
- 特征向量
- 相似度公式:
- Jaccard公式:
w u v = ∣ N ( u ) ∩ N ( v ) ∣ ∣ N ( u ) ∪ N ( v ) ∣ w_{uv} = \frac{|N(u)\cap N(v)|}{|N(u) \cup N(v)|} wuv=∣N(u)∪N(v)∣∣N(u)∩N(v)∣ - 余弦相似度:
w u v = ∣ N ( u ) ∩ N ( v ) ∣ ∣ N ( u ) ∪ N ( v ) ∣ w_{uv} = \frac{|N(u)\cap N(v)|}{\sqrt{|N(u) \cup N(v)|}} wuv=∣N(u)∪N(v)∣∣N(u)∩N(v)∣
- Jaccard公式:
相似的的计算复杂度非常大,这是一个很严重的问题,可以通过构建物品的倒排索引来解决这个问题。对于每个物品,和这个物品有关系的用户,对应的稀疏矩阵+K个物品。以下图解释,如何得到倒排表的:
对普通UserCF的小提升-UserCF-IIF:
考虑物品的流行度,加一个惩罚因子,来惩罚过度流行的商品。
w u v = ∑ i ∈ N ( u ) ∩ N ( v ) 1 l o g ( 1 + ∣ N ( i ) ∣ ) ∣ N ( u ) ∪ N ( v ) ∣ w_{uv} = \frac{\sum_{i\in N(u)\cap N(v)}\frac{1}{log(1+|N(i)|)}}{\sqrt{|N(u) \cup N(v)|}} wuv=∣N(u)∪N(v)∣∑i∈N(u)∩N(v)log(1+∣N(i)∣)1
用户ABCD,他们分别喜欢的物品时{a,b,d},{a,c},{b,e},{c,d,e}
。
基于物品的协同过滤算法-ItemCF:
ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要分析用户的行为记录计算物品相似度。
此处有点偏经验性,通过内兄属性计算也不是说不可以。
UserCF的缺陷:
- 随着用户量的增加,计算用户兴趣相似度矩阵复杂度太大;
- 推荐结果的可解释性不好;
Iterm-CF步骤:
- 计算物品之间的相似度;
- 根据物品相似度和用户历史行为生成推荐
相似度计算方法:
w
i
j
=
∣
N
(
i
)
∩
N
(
j
)
∣
∣
N
(
i
)
∣
∣
N
(
j
)
∣
w_{ij} = \frac{|N(i)\cap N(j)|}{\sqrt{|N(i)||N(j)|}}
wij=∣N(i)∣∣N(j)∣∣N(i)∩N(j)∣
分子: 即喜欢物品
i
i
i,也喜欢物品
j
j
j的用户数;
分母:
N
(
i
)
N(i)
N(i)喜欢物品
i
i
i的用户数,
j
j
j类似;
和UserCF类似,使用物品倒排表来计算,物品相似度矩阵。下图简单说明,相似度矩阵是如何求得的。左边每一行代表一个用户喜欢的物品集合。
ItemCF计算一个用户
u
u
u对一个物品
j
j
j的兴趣:
p
u
j
=
∑
i
∈
N
(
u
)
∩
S
(
j
,
k
)
w
j
i
r
u
i
p_{uj} = \sum_{i\in N(u)\cap S(j,k)}w_{ji}r_{ui}
puj=i∈N(u)∩S(j,k)∑wjirui
- N ( u ) N(u) N(u):用户 u u u喜欢的物品的集合;
- S ( j , k ) S(j,k) S(j,k):和物品 j j j最相似的K个物品;
- w i j w_{ij} wij:物品i,j之间的相似度;
- r u i r_{ui} rui:用户u对物品i的兴趣,如果是1-5级评分则为相对应的评分,如果是喜欢与否,则为1
用户活跃度对物品相似度的影响:
我们可以认为,过于活跃的用户对物品相似度的贡献不如活跃度较差的,不过这里面也应该有一个阈值限制,不活跃的等级。为了修正活跃的用户对于相似度的贡献:
w i j = ∑ u ∈ N ( i ) ∩ N ( j ) 1 l o g ( 1 + ∣ N ( u ) ∣ ) ∣ N ( i ) ∣ ∣ N ( j ) ∣ w_{ij} = \frac{\sum_{u\in N(i)\cap N(j)}\frac{1}{log(1+|N(u)|)}}{\sqrt{|N(i)||N(j)|}} wij=∣N(i)∣∣N(j)∣∑u∈N(i)∩N(j)log(1+∣N(u)∣)1
物品归一化相似度:
w
i
j
′
=
w
i
j
m
a
x
j
w
i
j
w_{ij}' = \frac{w_{ij}}{max_jw_{ij}}
wij′=maxjwijwij
通过物品归一化相似度,可以解决类内,类间,物品相似度差距比较大的问题。
UserCF VS ItemCF:
UserCF | ItemCF | |
---|---|---|
推荐原理 | 推荐那些和用户有共同兴趣爱好的用户所喜欢的产品 | 给用户推荐和他之前喜欢的物品类似的物品 |
侧重方面 | 和用户兴趣相似的小群体的热点 | 维系用户的历史兴趣 |
群体 | 社会化 | 个性化 |
技术角度 | 用户相似度矩阵 | 用物品相似度矩阵 |
性能 | 适用于用户较少的场合 | 适用于物品数量较少的场合 |
领域 | 时效性强,用户兴趣稳定 | 长尾物品丰富,个性化需求强烈 |
2.5 隐语义模型(LFM):
基于兴趣的分类三个主要问题:
- 如何给物品进行分类;
- 如何确定用户对哪些类的物品感兴趣,以及感兴趣程度;
- 物品在所属类的权重和排序如何确定;
问题1:专家进行分类
缺点:
- 专家的意见不代表用户的意见;
- 专家很难控制分类;
- 专家很难给一个物品多个分类;
LFM计算用户
u
u
u对物品
i
i
i的兴趣:
P
r
e
f
e
r
e
n
c
e
(
u
,
i
)
=
r
u
,
i
=
∑
f
=
1
F
p
u
,
k
q
i
,
k
Preference(u,i) = r_{u,i} = \sum_{f=1}^Fp_{u,k}q_{i,k}
Preference(u,i)=ru,i=f=1∑Fpu,kqi,k
- p u , k p_{u,k} pu,k:用户u的兴趣和第k个隐类的关系;
- q i , k q_{i,k} qi,k:第k个隐类和物品i的关系;
在隐性反馈数据集中训练得到参数,隐性反馈数据集中只有正样本(用户喜欢什么),没有负样本,如何生成阜阳们便成为一个问题。
- 1.对一个用户,用他没有过行为的物品作为负样本;
- 2.没有过行为的物品,采样出一部分;
- 3.采样的时候保证每个用户的正负样本相当;
- 4.采样的时候偏重采样不热门的物品;
效果来看:第三种>第二种>第四种>第一种
经过采样以后得到训练集,用户-物品集
K
=
{
u
,
i
}
K=\{u,i\}
K={u,i},如果
(
u
,
i
)
(u,i)
(u,i)是正样本那么
r
u
i
=
1
r_{ui}=1
rui=1,否则是0:
C
=
∑
(
u
,
i
)
∈
K
(
r
u
i
−
r
^
u
i
)
2
=
∑
(
u
,
i
)
∈
K
(
r
u
i
−
∑
k
=
1
K
p
u
,
k
q
i
,
k
)
2
+
λ
∥
p
u
∥
2
+
λ
∥
q
i
∥
2
C=\sum_{(u, i) \in K}\left(r_{u i}-\hat{r}_{u i}\right)^{2}=\sum_{(u, i) \in K}\left(r_{u i}-\sum_{k=1}^{K} p_{u, k} q_{i, k}\right)^{2}+\lambda\left\|p_{u}\right\|^{2}+\lambda\left\|q_{i}\right\|^{2}
C=(u,i)∈K∑(rui−r^ui)2=(u,i)∈K∑(rui−k=1∑Kpu,kqi,k)2+λ∥pu∥2+λ∥qi∥2
通过梯度下降便可训练得到合适的参数
q
q
q和
p
p
p。
2.6 基于图的模型:
将用户行为表示为二分图模型,推荐任务变转换成度量用户定点和没有边连接的物品定点在图上的相关性的问题。
度量两个顶点之间相关性的算法:
- 两个顶点之间的路径数;
- 两个顶点之间的长度;
- 两个顶点之间的路径经过的顶点;
相关性较高的顶点所具有的特征:
- 两个顶点之间有很多路径相连;
- 连接的路径长度比较短;
- 路径不会经过出度比较大的点;
第三章 推荐系统冷启动问题
3.1冷启动简介:
分类:
- 用户冷启动:针对新用户;
- 物品冷启动:新的物品;
- 系统冷启动:新开发网站,没有用户,没有行为信息,只有少量物品信息;
3.2 利用用户注册信息:
信息分类:
- 人口统计学信息:年龄,性别,职业,学历等;
- 用户兴趣描述:文字描述兴趣;
- 用户站外行为数据:其它网站的行为数据和社交数据;
基于注册信息的个性化推荐流程:
- 获取用户注册信息;
- 根据注册信息对用户进行分类;
- 推荐所属分类用户喜欢的商品;
如何根据注册信息对用户进行分类呢,是否可以用聚类,尽可能分更多的类,根据注册信息进行分类,如果test的准确率特别高的话,可以考虑将label加入到聚类里面一起进行聚类。
重点是计算特征喜欢的物品,也就是某个特征和物品的关系。
p
(
f
,
i
)
p(f,i)
p(f,i)具有特征
f
f
f的用户对物品
i
i
i的喜好程度:
p
(
f
,
i
)
=
∣
N
(
i
)
∩
U
(
f
)
∣
p(f,i) = |N(i) \cap U(f)|
p(f,i)=∣N(i)∩U(f)∣
N
(
i
)
N(i)
N(i):喜欢物品i的用户集合;
U
(
f
)
U(f)
U(f):具有特征f的用户集合;
为了解决热门物品,修改为喜欢物品i的用户中具有特征
f
f
f的比例:
p
(
f
,
i
)
=
∣
N
(
i
)
∩
U
(
f
)
∣
N
(
i
)
+
α
p(f,i) = \frac{|N(i) \cap U(f)|}{N(i)+\alpha}
p(f,i)=N(i)+α∣N(i)∩U(f)∣
α \alpha α的是为了解决数据稀疏问题。但是 α \alpha α应该如何确定呢。
用户的人口统计学特征越多,越能准确的预测用户兴趣。
3.3 选择合适的物品启动用户的兴趣:
启动用户的物品特点:
- 比较热门的物品,冷门物品用户甚至无法给出正确的反馈;
- 具有代表性和区分型的物品;
- 物品集合需要更多的多样性;
衡量一个物品的区分度:
D
(
i
)
=
σ
u
∈
N
+
(
i
)
+
σ
u
∈
N
+
(
i
)
+
σ
u
∈
N
−
(
i
)
D(i) = \sigma_{u\in N^+(i)}+\sigma_{u\in N^+(i)} + \sigma_{u\in N^-(i)}
D(i)=σu∈N+(i)+σu∈N+(i)+σu∈N−(i)
σ
u
∈
N
+
(
i
)
\sigma_{u\in N^+(i)}
σu∈N+(i):喜欢i的用户集合,对应的评分方差;
σ
u
∈
N
+
(
i
)
\sigma_{u\in N^+(i)}
σu∈N+(i):不喜欢i的用户集合,对应的评分方差
σ
u
∈
N
−
(
i
)
\sigma_{u\in N^-(i)}
σu∈N−(i):没有评分的用户,对应的其他物品评分方差;
3.4 利用物品信息解决物品冷启动问题:
物品内容信息通过向量空间模型来表示。
将物品的内容表示成关键词向量:
d
i
=
(
e
1
,
w
1
)
,
(
e
2
,
w
2
)
.
.
.
d_i = {(e_1, w_1),(e_2,w_2)...}
di=(e1,w1),(e2,w2)...
e
i
e_i
ei:关键词向量;
w
i
w_i
wi:关键词权重
得到向量后,物品之间两两计算相似度,复杂度是 O ( N 2 ) O(N^2) O(N2)。采用关键词-物品倒排表可以加速。
第四章 利用用户标签数据:
除了前面讲过的基于用户喜欢过的物品,利用兴趣相似的用户这两种方式,另一种常用的方式是通过一些特征来联系用户和物品,其实这和我们常用的方式相一致,也就是常说的做特征。特征可以是用户属性,也可以是用户特征,和隐语义向量。
标签系统的作用:
- 表达:帮助我们表达对电影的看法;
- 组织:帮助组织喜欢的电影;
- 学习:增加对电影的了解;
- 发现:更容易发现喜欢的电影;
- 决策:帮助判断是否看一部电影;
第五章 利用上下文信息
时间上下文信息:
时间信息对用户兴趣的影响表现:
- 用户兴趣是变化的;
- 物品是有生命周期的;
- 季节效应;
包含时间信息的用户行为数据集,由一系列三元组组成, ( u , i , t ) (u,i,t) (u,i,t),表示用户u在时刻t对物品i产生过行为。
物品的生存周期和系统的时效性:
- 物品的平均在线天数:它和物品的流行程度成正比;
推荐系统的实时性;
推荐系统的的时间多样性;
时间上下文推荐算法:
最近最热门: 物品i在时间T的流行度
n
i
(
T
)
=
∑
(
u
,
i
,
t
)
∈
T
r
a
i
n
,
t
<
T
1
1
+
α
(
T
−
t
)
n_i(T) = \sum_{(u,i,t)\in Train,t<T}\frac{1}{1+\alpha(T-t)}
ni(T)=(u,i,t)∈Train,t<T∑1+α(T−t)1
时间上下文相关的ItemCF:
-
原始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)\cap N(j)} 1}{\sqrt{|N(i)||N(j)|}} Sim(i,j)=∣N(i)∣∣N(j)∣∑u∈N(i)∩N(j)1 -
添加时间衰减项:
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)\cap N(j)} f(|t_{ui}-t_{uj}|)}{\sqrt{|N(i)||N(j)|}} Sim(i,j)=∣N(i)∣∣N(j)∣∑u∈N(i)∩N(j)f(∣tui−tuj∣) -
f ( ∣ t u i − t u j ∣ ) f(|t_{ui}-t_{uj}|) f(∣tui−tuj∣)时间衰减函数,eg.:
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(∣tui−tuj∣)=1+α∣tui−tuj∣1
时间上下文相关的UserCF:
-
原始UserCF相似度计算公式:
w u v = ∣ N ( u ) ∩ N ( v ) ∣ ∣ N ( u ) ∣ ∪ ∣ N ( v ) ∣ w_{uv} = \frac{|N(u)\cap N(v)|}{\sqrt{|N(u)|\cup |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)\cap N(v)} \frac{1}{1+\alpha|t_{ui}-t_{vi}|}}{\sqrt{|N(u)|\cup |N(v)|}} wuv=∣N(u)∣∪∣N(v)∣∑i∈N(u)∩N(v)1+α∣tui−tvi∣1
其实UserCF和ItemCF都是相似的,都是在计算相似度的时候添加一个时间衰减因子。
地点上下文信息:
基于位置的推荐算法:
LARS(Location Aware Recommend System):
- 将物品分为两类:有、无空间属性;
- 用户同样分为两类:有空间属性,没有直接的空间属性的;
用户兴趣和地点相关的两组特征:
- 兴趣本地化:根据位置不同聚集的人,具有不同的兴趣,此处可以提取一些,地点特征,单纯的可以根据经纬度来进行聚类,可以聚成不同的组,然后作为不同的特征,让模型来进行选择。
- 活动本地化:有些人只是在某个范围活动,
推荐资料:
- collaborative filtering with temporal dynamics;
- Temporal Diversity in Recommender Systems;
- Evaluating Collaborative Filtering Over Time;
- http://pages.stern.nyu.edu/~atuzhili/
第六章 利用社交网络数据:
获取社交网络数据的途径:
- 电子邮件;
- 用户注册信息;
- 用户的位置数据;
- 论坛和讨论组;
- 即时聊天工具;
- 社交网站:
- Faceboook:熟人社交,社会图谱;
- Twitter:陌生人社交,兴趣图谱;
社交网络数据简介:
利用图来定义社交网络:
- G ( V , E , w ) G(V,E,w) G(V,E,w):代表一个社交网络;
- V V V:顶点,用户集合;
-
E
E
E:边,用户关系集合;
- Facebook:双向确认,无向边连接;
- Twitter:单向关系,有向边连接;
- w w w:边的权重;
- o u t ( u ) out(u) out(u):用户 u u u指向(关注)的点集合;
- i n ( u ) in(u) in(u):指向用户 u u u的顶点集合(被关注);
社会化推荐的优点和缺点
优点:
- 好友推荐可以增加推荐的信任度;
- 社交网络可以解决冷启动问题;
缺点:
- 不一定能提高离线精度;
- 社交群体内不一定有共同的兴趣
基于社交网络的推荐:
基于领域的社会化推荐算法:
根据社交网络和用户行为数据集来进行推荐,社交网络给出用户之间的好友关系。
用户
u
u
u对物品
i
i
i的兴趣:
p u i = ∑ v ∈ o u t ( u ) w u v r v i p_{ui} = \sum_{v\in out(u)}w_{uv}r_{vi} pui=v∈out(u)∑wuvrvi
- o u t ( u ) out(u) out(u):用户 u u u的好友集合;
-
w
u
v
w_{uv}
wuv:用户u和v的相似度;
- 用户的熟悉度:共同好友的比例
f a m i l i a t i r y ( u , v ) = o u t ( u ) ∩ o u t ( v ) o u t ( u ) ∪ o u t ( u ) familiatiry(u,v) = \frac{out(u) \cap out(v)}{out(u) \cup out(u)} familiatiry(u,v)=out(u)∪out(u)out(u)∩out(v) - 用户的兴趣相似度:喜欢的物品集合重复度
f a m i l i a t i r y ( u , v ) = N ( u ) ∩ N ( v ) N ( u ) ∪ N ( v ) familiatiry(u,v) = \frac{N(u) \cap N(v)}{N(u) \cup N(v)} familiatiry(u,v)=N(u)∪N(v)N(u)∩N(v)
- 用户的熟悉度:共同好友的比例
- r v i r_{vi} rvi:用户u喜欢i则为1,否则为0
基于图的社会化推荐算法:
可以将用户之间的关系以及用户是否属于同一个社群,构建在一个途中。
左边是社群,如果两个用户和同一个社群相连,代表他们属于同一个社群。用户之间同样用边相连,代表他们之间的关系。