一、基本概念
在搜索引擎中,推荐是一个重要的技术。从某种角度看,搜索本身就是一种推荐,搜索引擎通过算法(如PageRank,文档余弦相似度)召回排名最高的文档,并推荐给查询者。而一个推荐系统,希望尽可能返回少但精确的文档给它的使用者,所以,我们需要提出一种尽可能返回高价值文档的推荐算法,这个算法有可能基于内容,基于交互,或者基于关系。协同过滤就是一个基于多用户、多观察点和多数据源的对信息或者模式进行过滤的算法。通过协同过滤,推荐系统可以快速筛选出相关的页面、文章、广告、商品等信息。
二、推荐系统的分类
根据过滤主体和观察点的不同,我们可以把推荐系统分为以下几类。
- 基于内容的推荐
- 基于用户的推荐:基于用户的特征(如用户的职业,年龄)
- 基于物品的推荐:基于物品的特征(如文档的关键词)
- 基于协同过滤的推荐:基于用户和物品之间的交互
- 混合型:基于内容和基于协同过滤相结合的推荐系统
2.1基于内容的推荐系统
基于内容的推荐算法,核心思想是将所查询内容与其他内容的相似度进行对比,返回相似度最高的对象作为推荐结果。常见的算法有向量空间模型(Vector Space Model)。向量空间模型的具体内容可以参考之前的博客。
对基于物品的推荐,一个例子是物品的名字,物品名字可以被表示为关键词组成的词向量。对基于用户的推荐,譬如用户最近的消费列表,购物车,浏览列表等,都能被表示为用户的向量。
2.2基于协同过滤的推荐系统
用户与物品之间的交互可以有多种,譬如收藏,点赞,评分,购买等,这些行为可以用一个用户-物品交互矩阵来表示,矩阵的值根据交互的具体种类而定。如下图就是一个点赞-点踩的交互矩阵。协同过滤的中心思想是类似的用户会有类似的喜好,譬如说A用户喜欢a、b、c
物品,B用户喜欢a、b
物品,那B用户很可能也喜欢c
物品。用一句话来说就是物以类聚,人以群分。
2.2.1 关键问题
矩阵稀疏
下面的表格是一个用户-物品交互表格,可以看到,不是所有的用户列和用户行都能被填满,这种情况又称矩阵的稀疏问题,用户稀疏指某个用户与物品的交互少,物品稀疏指某个物品被用户交互的次数少。
冷启动
除了稀疏问题外,冷启动问题也是一个值得关注的问题。当新的物品或者用户加入系统中时,它是没有用户-物品交互数据的,这个数据一定是稀疏的。
2.2.2协同过滤的工作机制
协同过滤的交互来源有显式和隐式两种。显式的交互通常是用户自发地进行评分、评论等行为,这些交互能直接体现用户的喜好。隐式的交互更多是点击、购买记录、关注点赞等信息,需要进行转化和提取才能获得有用的信息。
协同过滤
协同过滤算法有很多,人们通常把诸多算法分为两类:
- 基于内存的算法
- 基于模型的算法
基于内存的协同过滤算法
基于内存的协同过滤推荐算法依据用户和物品两个不同的维度又被分为:
- 基于用户的协同过滤推荐,User-based CF
- 基于物品的协同过滤推荐,Item-based CF
对User-based CF来说,我们可以直接用最近似的top-K个点进行直接求平均获得。我们也可以对这top-K个最近似的点采用加权平均求和法来预测最终评分。假设
v
i
,
j
v_{i,j}
vi,j 为用户
i
i
i对
j
j
j的评分,
v
i
ˉ
\bar{v_i}
viˉ 为用户i的平均打分,
S
i
m
(
a
,
b
)
Sim(a,b)
Sim(a,b)为用户
a
a
a和用户
b
b
b的相似程度,这里的相似函数可以使用Pearson相关系数、余弦相似、欧氏距离和曼哈顿距离等。假设
U
k
U_k
Uk 为最近似的k个用户组成的集合
m
(
a
,
i
)
m(a,i)
m(a,i)为用户
a
a
a对物品
i
i
i的直接平均预测值,公式为:
m
(
a
,
i
)
=
∑
u
∈
U
k
v
(
u
,
i
)
∑
u
∈
U
k
∣
S
i
m
(
a
,
u
)
∣
m(a,i)=\dfrac{\sum_{u\in U_k}v(u,i)}{\sum_{u\in U_k}|Sim(a,u)|}
m(a,i)=∑u∈Uk∣Sim(a,u)∣∑u∈Ukv(u,i)
w
(
a
,
i
)
w(a,i)
w(a,i)为用户
a
a
a对物品
i
i
i的加权平均预测值,公式为:
w
(
a
,
i
)
=
∑
u
∈
U
k
S
i
m
(
a
,
u
)
v
(
u
,
i
)
∑
u
∈
U
k
∣
S
i
m
(
a
,
u
)
∣
w(a,i)=\dfrac{\sum_{u\in U_k}Sim(a,u)v(u,i)}{\sum_{u\in U_k}|Sim(a,u)|}
w(a,i)=∑u∈Uk∣Sim(a,u)∣∑u∈UkSim(a,u)v(u,i)
由于用户性格不同,可能不同用户对物品的严格程度也会影响结果,所以这里我们用每个用户的平均喜好来修正结果。用 p ( a , j ) p(a,j) p(a,j)表示修正后用户 a a a对物品 j j j的评分预测公式:
p
a
,
j
=
v
a
ˉ
+
k
∑
i
=
1
N
w
(
a
,
i
)
(
v
i
,
j
−
v
i
ˉ
)
p_{a,j}=\bar{v_a}+k\sum_{i=1}^Nw(a,i)(v_{i,j}-\bar{v_i})
pa,j=vaˉ+ki=1∑Nw(a,i)(vi,j−viˉ)
其中
k
k
k是一个
(
0
,
1
)
(0,1)
(0,1)之间的数字,表示加权平均的
w
(
a
,
i
)
w(a,i)
w(a,i)对最后结果的贡献比例。
Item-based CF和User-based CF的运算十分相似,我们用
I
k
I_k
Ik表示最近似的k个物品,
S
i
m
(
i
,
j
)
Sim(i,j)
Sim(i,j)表示物品
i
i
i和
j
j
j的相似性,用
r
a
,
i
r_{a,i}
ra,i表示用户
a
a
a对物品
i
i
i的评分,用
r
i
ˉ
\bar{r_i}
riˉ表示物品
i
i
i评分的平均,并用
w
(
a
,
i
)
w(a,i)
w(a,i)表示加权平均的预测值,我们可以把
w
(
a
,
i
)
w(a,i)
w(a,i)表示为:
w
(
a
,
i
)
=
∑
j
∈
I
k
S
i
m
(
i
,
j
)
r
a
,
j
∑
j
∈
I
k
S
i
m
(
i
,
j
)
w(a,i)=\dfrac{\sum_{j\in I_k}Sim(i,j)r_{a,j}}{\sum_{j\in I_k} Sim(i,j)}
w(a,i)=∑j∈IkSim(i,j)∑j∈IkSim(i,j)ra,j
跟User-based CF类似,我们可以用物品被评分的均值消除个体偏差,得到修正后的预测值
p
(
a
,
i
)
p(a,i)
p(a,i):
p
(
a
,
i
)
=
r
i
ˉ
+
∑
j
∈
I
k
S
i
m
(
i
,
j
)
(
r
a
,
j
−
r
j
ˉ
)
∑
j
∈
I
k
S
i
m
(
i
,
j
)
p(a,i)=\bar{r_i}+\dfrac{\sum_{j\in I_k}Sim(i,j)(r_{a,j}-\bar{r_j})}{\sum_{j\in I_k} Sim(i,j)}
p(a,i)=riˉ+∑j∈IkSim(i,j)∑j∈IkSim(i,j)(ra,j−rjˉ)
至此我们讨论完了基于内容的协同过滤,其实现方法是评分矩阵的线性组合。
这里顺带提出一个推论:Item-based CF比User-based CF表现要好,原因有三:
- 物品的相似性比用户的相似性更可靠
- 物品有更多属性可以比较,但是用户出于隐私很难获得大量属性
- 物品是不会变的,但是人的属性和喜好都会变化
作为优化,可以对用户-物品矩阵进行降维,在降维空间中,更方便测算用户之间的相似性。具体将在下一篇博客中谈到。
2.2.3 模型评估
- 对于布尔类型的矩阵,我们可以直接用Precision和Recall进行模型的评估
- 对于非布尔类型的矩阵,我们可以使用NDCG来评价Rank的正确性,MAE或RMSE来评价Prediction分数的准确性。
在商业化推荐系统中,为了给用户推荐新颖的商品,这里还需要对物品的新颖程度作评价,下面几个特殊的指标。 - 新颖程度Novelty表示系统推荐给用户未曾发现的物品的能力,假设用户 u u u过去关注的商品集为 H u H_u Hu, d i s t i , H dist_{i,H} disti,H为物品i到商品集 H H H的最短距离,那物品 i i i对于用户 u u u的新颖程度 n o v e l t y ( i u ) = d i s t i , H u novelty(i_u)=dist_{i,H_u} novelty(iu)=disti,Hu
- 多元性Diversity表示推荐系统给用户推荐物品的多元化程度,物品与物品之间相似度越低,多元化程度越高,假设被推荐的物品清单为 L L L, L L L的多元性可以被表示为 d i v e r s i t y ( L ) = ∑ i ∈ L ∑ j ∈ ( L − i ) d i s t i , j ∣ L ∣ ∣ L − 1 ∣ diversity(L)=\dfrac{\sum_{i \in L}\sum_{j\in (L-i)}dist_{i,j}}{|L||L-1|} diversity(L)=∣L∣∣L−1∣∑i∈L∑j∈(L−i)disti,j.
- 覆盖程度Coverage有点类似召回率Recall,它表示被正确推荐的物品 T ^ \hat{T} T^跟总共应该被推荐的物品 T T T的比例。公式为$ c o v e r a g e = ∣ T ^ ∣ ∣ T ∣ coverage=\dfrac{|\hat{T}|}{|T|} coverage=∣T∣∣T^∣
- 传播度Spread表示被推荐的物品是否均匀分布,它是物品分布的信息熵。在长尾效应显著的推荐系统里,它的传播度应该很低。假设被推荐的物品出现概率为 P i P_i Pi,传播度为 s p r e a d = − ∑ i ∈ I P ( i ) log P ( i ) spread=-\sum_{i\in I} P(i)\log P(i) spread=−i∈I∑P(i)logP(i)
- 惊喜度Serendipity表示被正确推荐的物品有多出乎用户的意料。令
L
u
L_u
Lu为正确推荐的物品集,惊喜度的公式为
- Knowledge-Centric Evaluation,我们关心推荐模型对用户带来的具体影响,譬如用户是否真的被吸引,用户是否真的会购买等。这部分的评价取决于应用设计。
- System Evaluation,我们认为离线系统、在线系统、推荐系统的训练时间、预测性能等工程要素也是我们评价一个推荐系统的方面。