推荐系统:
整体可分为召回(recall)+排序(rank),召回是指找出很多待推荐的物品,排序是指对于这些物品打分,依照打分顺序选择靠前的几个推荐给用户。
协同过滤 Collaborative filtering:
- CF分为 Neighborhood model (比如User-based 和 Item-based) 和 Latent factor model (例如SVD),首先介绍Neighborhood model(本质上是KNN)。
ItemCF
-
ItemCF:
- 给用户推荐他喜欢的物品的相似物品–>如何衡量物品的相似度?
- 在用户-物品矩阵中,是按列计算相似度的。
-
物品相似度矩阵的计算:
S i j = ∣ u ( i ) ∣ ∩ ∣ u ( j ) ∣ ∣ u ( i ) ∣ ∪ ∣ u ( j ) ∣ S_{ij}=\frac{|u(i)|\cap|u(j)|} {{\sqrt{|u(i)| \cup |u(j)|}}} Sij=∣u(i)∣∪∣u(j)∣∣u(i)∣∩∣u(j)∣
这个式子表示物品 i i i和物品 j j j之间的相似度, u ( i ) u(i) u(i)表示对于物品 i i i有过操作的用户的集合。分子表示计算两个物品公共的用户的集合,分母是对人数做了归一化。 -
计算用户对于新物品 j j j的评分(假设用户已经访问过物品 i i i):
P u j = ∑ i ∈ 用 户 访 问 过 的 物 品 集 合 S i j ∗ r u i P_{uj}=\sum_{i\in 用户访问过的物品集合}S_{ij}*r_{ui} Puj=i∈用户访问过的物品集合∑Sij∗rui
r u i r_{ui} rui是一个权重,是用户u对于已访问过的物品i的打分(如电影评分)。 -
一些公式升级
- 降低活跃用户的权重,如某个用户是批发商,他啥东西都买,那么我们要降低他的权重(活跃用户的权重适当降低):
S i j = ∑ u ∈ u ( i ) ∩ u ( j ) 1 ( l o g 1 + ∣ N ( u ) ∣ ) ∣ u ( i ) ∣ ∪ ∣ u ( j ) ∣ S_{ij}=\frac{\sum_{u \in u(i)\cap u(j)} \frac{1}{(log{1+|N(u)|)}}} {{\sqrt{|u(i)| \cup |u(j)|}}} Sij=∣u(i)∣∪∣u(j)∣∑u∈u(i)∩u(j)(log1+∣N(u)∣)1
∣ N ( u ) ∣ |N(u)| ∣N(u)∣是用户u访问过的物品的个数,可见 他在分母上所以访问个数越多,权重越低。 - 对用户的喜好加入时间衰减
S i j = ∑ u ∈ u ( i ) ∩ u ( j ) f ( Δ t ) ∣ u ( i ) ∣ ∪ ∣ u ( j ) ∣ S_{ij}=\frac{\sum_{u \in u(i)\cap u(j)} f (\Delta t)} {{\sqrt{|u(i)| \cup |u(j)|}}} Sij=∣u(i)∣∪∣u(j)∣∑u∈u(i)∩u(j)f(Δt)
f ( Δ t ) = 1 1 + α Δ t f (\Delta t)=\frac{1}{1+\alpha \Delta t} f(Δt)=1+αΔt1 是时间衰减项
UserCF
-
UserCF:
- 给用户推荐兴趣相似的用户感兴趣的物品(如问别人喜欢看什么书,自己也去借一本相同的)–>如何衡量用户的相同兴趣?
- 在用户-物品矩阵中,是按行计算相似度的。
-
用户相似度矩阵的计算:
S u v = ∣ N ( u ) ∣ ∩ ∣ N ( v ) ∣ ∣ N ( u ) ∣ ∪ ∣ N ( v ) ∣ S_{uv}=\frac{|N(u)|\cap|N(v)|} {{\sqrt{|N(u)| \cup |N(v)|}}} Suv=∣N(u)∣∪∣N(v)∣∣N(u)∣∩∣N(v)∣
整体看来,与itemCF相同, N ( u ) N(u) N(u)表示用户u有过操作的item的集合。 -
计算用户 u u u对于新物品 i i i的评分:
P u i = ∑ v ∈ 其 他 相 似 用 户 集 合 S u v ∗ r v i P_{ui}=\sum_{v \in 其他相似用户集合}S_{uv}*r_{vi} Pui=v∈其他相似用户集合∑Suv∗rvi
S u v S_{uv} Suv是两个用户相似度评分, r v i r_{vi} rvi是另一个用户对物品i的打分 -
一些公式升级
- 降低活跃商品的权重(如果商品被很多人购买,那么不能称之为个性推荐,只有那些不常被购买的物品才是个性的东西,如《新华字典》与《机器学习》)
对物品i进行推荐,其权重修正如下,越活越权重越低
S u v = ∑ i ∈ N ( u ) ∩ N ( v ) 1 ( l o g 1 + ∣ u ( i ) ∣ ) ∣ N ( u ) ∣ ∪ ∣ N ( v ) ∣ S_{uv}=\frac{\sum_{i \in N(u)\cap N(v)} \frac{1}{(log{1+|u(i)|)}}} {{\sqrt{|N(u)| \cup |N(v)|}}} Suv=∣N(u)∣∪∣N(v)∣∑i∈N(u)∩N(v)(log1+∣u(i)∣)1 - 对用户的喜好加入时间衰减(意义在于,保证两个用户当前的兴趣是相同的,所以需要对点击时间差加上权重)
S i j = ∑ i ∈ N ( u ) ∩ N ( v ) f ( Δ t i ) ∣ N ( u ) ∣ ∪ ∣ N ( v ) ∣ S_{ij}=\frac{\sum_{i \in N(u)\cap N(v)} f (\Delta t_i)} {{\sqrt{|N(u)| \cup |N(v)|}}} Sij=∣N(u)∣∪∣N(v)∣∑i∈N(u)∩N(v)f(Δti)
f ( Δ t i ) = 1 1 + α Δ ∣ t u i − t v i ∣ f (\Delta t_i)=\frac{1}{1+\alpha \Delta |t_{ui}-t_{vi}|} f(Δti)=1+αΔ∣tui−tvi∣1 是用户u和用户v访问物品的时间差。
ItemCF & UserCF 优缺点
- 推荐实时性:
- ItemCF :立即,只需返回相似的物品;
- UserCF: 不会立刻,因为要重新计算用户间的相似度矩阵。
- 新用户的推荐:
- ItemCF :可以推荐相似物品。
- UserCF:不能立刻推荐,因为无法计算用户相似度。
- 新物品的推荐
- ItemCF :不能立刻推荐,因为无法计算物品相似度。
- UserCF:被用户点击后,可以推荐给相似用户。
- 可解释性:
- ItemCF :可解释
- UserCF:不可解释
- 性能考量:
- 由于需要计算物品相似度矩阵/用户相似度矩阵,需要根据实际情况选择哪种CF。由于实际中用户数量一般远大于商品数量,所以一般选择itemCF。
- ItemCF更具有个性化的考量,性能更好。
评价指标
-
推荐算法评价指标(不同场景下不同)
- 信息流:点击率、平均阅读时长
- 电商:转化率(成交次数/点击次数) 、平均成交额度
- item覆盖率 (解决有一些item永远不会被推荐)
-
离线评价指标
- 在测试集上的性能
- F1值,
F
1
=
2
∗
r
∗
p
r
+
p
F_1=\frac{2*r*p}{r+p}
F1=r+p2∗r∗p:
- recall:正确推荐商品占用户需求的比例,6/10。越高越好。我们推荐的东西越多(50),越可能包含用户需求的商品。
- precision:推荐商品中有用推荐的个数,6/50。越高越好。推荐的东西越多(50),该值会降低。
r e c a l l = t p t p + f n = 6 6 + 4 recall = \frac{tp}{tp+fn}=\frac{6}{6+4} recall=tp+fntp=6+46,fn为预测false(错的),且预测为negative(负类),则真实其实是正类,也就是图中最左侧的4。
p r e c i s i o n = t p t p + f p = 6 6 + 44 precision = \frac{tp}{tp+fp}=\frac{6}{6+44} precision=tp+fptp=6+446,fp为预测false(错的),且预测为positive(正类),则真实其实是负类,也就是图中最右侧的44。
-
ABtest:制作多个推荐系统在线上进行测试,将用户随机分到其中一个组,根据其他指标衡量哪个系统比较好。指标包括:CTR(Click Through Rate),CR(Conversion Rate,网络转化率,即不仅仅要点击,还要进行某个操作,比如看完了电影,购买了商品的比例)等。
基于内容的的推荐系统(矩阵分解)
实例,电影推荐系统,对内容进行分解:
目的是填写下面这张矩阵表,然后选择分数高的推荐给用户。
对电影内容可做分解,得到不同电影的成分矩阵X【难点,如何计算电影的成分?–>人为观察标定】:
(此处特征数量
n
=
3
n=3
n=3,即将电影分解成了3个特征:爱情、喜剧、武侠)
求出用户喜好矩阵
θ
\theta
θ,将他和X相乘就可以得到用户评分矩阵,
θ
j
\theta_j
θj表示j用户对于不同类型电影的喜好程度。----怎么求?
-
用户喜好矩阵 θ \theta θ:根据用户已经打过分的电影和电影的成分矩阵,求得用户对每部电影的喜好程度(即填写上边的表格)。
-
也可以通过问卷调查得到用户喜好矩阵 θ \theta θ,然后用相似的办法求电影内容矩阵。(注意更换正则化项)
-
或者通过类似的方法同时求出两个矩阵,因为他们的目标函数是相同的,只需要加上各自的正则化项即可。
-
实例,假设已求得电影内容矩阵 X X X和用户喜好矩阵 θ \theta θ:
我们此时相当于在原始评分矩阵的一个子空间进行推荐,我们可以使用类似协同过滤的思路:- 给用户推荐和他相似用户的其他用户正在看的电影
- 给用户推荐他看过电影的相似电影
-
问题:如何计算向量间的相似度?
- 见后续分解
相似度的计算
-
欧氏相似度 Euclidean Distance Similarity:
s i m ( x , y ) = 1 1 + d ( x , y ) sim(x,y)=\frac{1}{1+d(x,y)} sim(x,y)=1+d(x,y)1
d ( x , y ) d(x,y) d(x,y)是两个点的欧氏距离 -
余弦相似度 Cosine Similarity(即余弦夹角,与量纲无关):
s i m ( x , y ) = x ∗ y ∣ x ∣ ∣ y ∣ sim(x,y)=\frac{x*y}{|x||y|} sim(x,y)=∣x∣∣y∣x∗y -
皮尔森相关性相似度(相关系数) Pearson Correlation Similarity:
s i m ( x , y ) = r ( x , y ) = C o v ( x ∗ y ) v a r ( x ) v a r ( y ) sim(x,y)=r(x,y)=\frac{Cov(x*y)}{\sqrt{var(x)var(y)}} sim(x,y)=r(x,y)=var(x)var(y)Cov(x∗y) -
Jaccard 距离:
用于计算集合的差异性,就是前边CF里的相似度计算公式,意思是两个集合的交集除以并集
s i m ( X , Y ) = ∣ X ∩ Y ∣ ∣ X ∣ U ∣ Y ∣ {sim(X,Y)={\frac {|X\cap Y|}{|X|U|Y|}}} sim(X,Y)=∣X∣U∣Y∣∣X∩Y∣
SVD
-
前言:我们可以不在原始的评分矩阵上计算不同item的相似度(因为矩阵很稀疏,相似度计算不一定准确),而矩阵分解则是另一种潜在语义模型(这两种方法都是CF的分支)。前边电影推荐系统的例子其实是一种对于评分矩阵的矩阵分解,假设电影含有 n n n个隐成分,则评分表 A ∈ R m ∗ n A \in R^{m*n} A∈Rm∗n可分解为电影成分矩阵 X X X,用户偏好矩阵 θ \theta θ。
接下来,先介绍数学定义的SVD,在之后的章节将他和推荐系统融合。 -
回忆PCA:以方差最大为目标,对原始数据进行降维。推倒后发现其实是对原始数据的协方差矩阵做了特征值分解,特征值的大小反应了这一维的贡献程度(方差占比)。(在这个过程中体现了矩阵的{旋转和缩放}作用)
SVD:对矩阵(可以不是方阵) A A A进行奇异值分解,分解(同时体现旋转、缩放、投影):
A = U Σ V T A = U\Sigma V^T A=UΣVT
其中:-
A
∈
R
m
×
n
A \in R^{m \times n}
A∈Rm×n,
U ∈ R m × m U \in R^{m \times m} U∈Rm×m 每一列是 A A T AA^T AAT的特征向量,
Σ ∈ R m × n \Sigma \in R^{m \times n} Σ∈Rm×n 是由奇异值组成的对角矩阵,奇异值是 A A T AA^T AAT的特征值的平方根,非零元素的个数等于原矩阵 A A A的秩 r r r,
V T ∈ R n × n V^T \in R^{n \times n} VT∈Rn×n 每一列是 A T A A^TA ATA的特征向量
左奇异矩阵可以对原始数据做行数的压缩, A d × n ′ = U d × m T A m × n A'_{d \times n} = U_{d \times m}^TA_{m \times n} Ad×n′=Ud×mTAm×n,同理右奇异矩阵可以做列数的压缩(即pca降维)
-
A
∈
R
m
×
n
A \in R^{m \times n}
A∈Rm×n,
-
原矩阵 A A A可展开成:
A = U [ Σ 0 0 0 ] V T = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + σ r u r v r T A = U \begin{bmatrix} \Sigma & 0 \\0 & 0 \\ \end{bmatrix} V^T = \sigma_1u_1v_1^T + \sigma_2u_2v_2^T + \sigma_ru_rv_r^T A=U[Σ000]VT=σ1u1v1T+σ2u2v2T+σrurvrT
注意展开式右侧,如果选取奇异值较大的几项代替整个展开式,则可以进行矩阵 A A A的压缩(图像压缩)。 -
矩阵 U U U和 V V V都是正交矩阵(两组基),矩阵 A A A的作用是将一个向量从以 V V V为基的空间旋转到以 U U U为基的空间,并且同时做了一定程度的缩放(缩放倍数就是奇异值大小),如果 V V V的维度大于 U U U的维度,那么还进行了投影。
-
SVM在推荐系统中的应用(参考):
- 在推荐系统(协同过滤)中,先对原评分矩阵
A
A
A做svd,得到较小的分解矩阵(选取前几个奇异值,使得总占比大于阈值)。使用分解矩阵对原始数据进行降维
A T ∗ U 4 ∗ Σ 4 . I A^T * U_4 * \Sigma_4 .I AT∗U4∗Σ4.I
得到隐层的物品的特征向量(此时每行是一个物品),在计算物品相似度的评分。 - 也可以反过来提取用户的隐层特征,上式变为:
A ∗ V 4 T ∗ Σ 4 . I A*V_4^T * \Sigma_4.I A∗V4T∗Σ4.I
则可计算用户的相似度,对用户做聚类等操作…
- 在推荐系统(协同过滤)中,先对原评分矩阵
A
A
A做svd,得到较小的分解矩阵(选取前几个奇异值,使得总占比大于阈值)。使用分解矩阵对原始数据进行降维