推荐系统基础算法
推荐系统基础算法分为基于内容的推荐算法和基于邻域的推荐算法,其中基于邻域的推荐算法又分为基于用户的协同过滤算法和基于物品的协同过滤算法。
一、基于内容的推荐算法
1. 流程
(1) 特征提取:提取物品的属性特征
(2) 用户偏好计算:利用一个用户的显示评分或隐式操作记录,计算用户不同特征上的偏好分数;由于用户的兴趣会随着时间的推移而变化,所以可以乘上时间系数
(3) 内容召回:将待推荐物品的特征与用户偏好得分匹配,取出用户最有可能喜欢的物品池
(4)物品排序:按用户偏好召回物品池,物品池可能包含太多物品,再进行排序,选择高分的进行推荐
2. 特征提取
(1) 结构化特征:例如电影的类别可以分为“爱情、剧情、科幻、战争、中国、日本、韩国、美国”,这几个特征可以组成向量,如果某个电影有该属性则该向量的该维度为1,否则为0;
(2) 非结构化特征:以推荐文章为例,常常会把文本的非结构化特征转化为结构化特征;例如假设N个待推荐的文章集合为
D
=
{
d
1
,
d
2
,
d
3
,
⋯
,
d
N
}
D=\{d_1, d_2, d_3, \cdots, d_N\}
D={d1,d2,d3,⋯,dN}, 所有文章出现的词的集合(词典)为
T
=
{
t
1
,
t
2
,
t
3
,
⋯
,
t
M
}
T=\{t_1, t_2, t_3, \cdots, t_M\}
T={t1,t2,t3,⋯,tM},则某篇文章j可以表示为
d
j
=
(
w
1
j
,
w
2
j
,
⋯
,
w
M
j
)
d_j=(w_{1j}, w_{2j}, \cdots, w_{Mj})
dj=(w1j,w2j,⋯,wMj), 其中
w
m
j
w_{mj}
wmj表示第一个词
t
m
t_m
tm在第j篇文章的权重;
A. 基础统计法:如果词
t
m
t_m
tm出现在第j篇文章,我们可以选取
w
m
j
w_{mj}
wmj为1;否则为0;
B. 词频统计法:基础统计法只考虑是否出现,对于常用的词语例如“我们”其实没有包含太多信息,所以采用TF-IDF。第j篇文章与词典中第m个词对应的TF-IDF为
T
F
−
I
D
F
(
t
m
,
d
j
)
=
T
F
(
t
m
,
d
j
)
∗
l
o
g
N
n
m
TF-IDF(t_m, d_j) = TF(t_m, d_j) * log{\frac{N}{n_m}}
TF−IDF(tm,dj)=TF(tm,dj)∗lognmN, 其中
T
F
(
t
m
,
d
j
)
TF(t_m, d_j)
TF(tm,dj)表示第m个词在第j篇文章出现的次数,
n
m
n_m
nm表示包含第m个词的文章数量,
n
m
n_m
nm越小,表示该词越稀有,越能代表该文章;
w
m
j
=
T
F
−
I
D
F
(
t
m
,
d
j
)
∑
T
F
−
I
D
F
(
t
m
,
d
j
)
2
w_{mj} = \frac{TF-IDF(t_m, d_j)}{\sqrt{\sum TF-IDF(t_m, d_j)^2}}
wmj=∑TF−IDF(tm,dj)2TF−IDF(tm,dj)
假设用户i喜欢第1、3、7篇文章,则该用户的内容特征向量为
U
i
=
(
d
i
1
+
d
i
3
+
d
i
7
)
/
3
=
(
u
1
i
,
u
2
i
,
⋯
,
u
m
i
)
U_i = (d_{i1} + d_{i3} + d_{i7}) / 3 = (u_{1i}, u_{2i}, \cdots, u_{mi})
Ui=(di1+di3+di7)/3=(u1i,u2i,⋯,umi),那么用户i在文章j的得分可以用以下余弦公式计算
s
c
o
r
e
=
c
o
s
θ
=
U
i
⋅
d
j
∣
∣
U
i
∣
∣
∣
∣
d
j
∣
∣
score = cos\theta = \frac{U_i \cdot d_j}{||U_i||||d_j||}
score=cosθ=∣∣Ui∣∣∣∣dj∣∣Ui⋅dj
(numpy.linalg可以计算逆矩阵、特征值、行列式等)
二、基于邻域的推荐算法
1. 基于物品的协同过滤算法
核心思想:给用户推荐那些和他们之前喜欢的物品相似的物品
(1)基于共同喜欢物品的用户列表计算
w
i
j
=
∣
N
(
i
)
∩
N
(
j
)
∣
∣
N
(
i
)
∣
w_{ij} = \frac{|N(i) \cap N(j)|}{|N(i)|}
wij=∣N(i)∣∣N(i)∩N(j)∣, 其中
N
(
i
)
N(i)
N(i)表示喜欢物品i的用户,
∣
N
(
i
)
∩
N
(
j
)
∣
|N(i) \cap N(j)|
∣N(i)∩N(j)∣表示同时喜欢物品i和物品j的用户;但是如果物品j很热门,很多人都喜欢,则
w
i
j
w_{ij}
wij将接近于1,所以改进公式
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)∣
(2)基于余弦相似度计算
上面的方法计算物品相似度是直接使用购买这两个物品的人数,但用户购买了不一定喜欢,所以数据集还包括了评分的数据,可以用余弦计算任意两本书的相似度,
w
i
j
=
c
o
s
θ
=
N
i
⋅
N
j
∣
∣
N
i
∣
∣
∣
∣
N
j
∣
∣
=
∑
k
=
1
l
e
n
(
n
k
i
×
n
k
j
)
∑
k
=
1
l
e
n
n
k
i
2
×
∑
k
=
1
l
e
n
n
k
j
2
w_{ij} = cos\theta = \frac{N_i \cdot N_j}{||N_i||||N_j||} = \frac{\sum_{k=1}^{len}(n_{ki} \times n_{kj})}{\sqrt{\sum_{k=1}^{len}n_{ki}^2} \times \sqrt{\sum_{k=1}^{len}n_{kj}^2}}
wij=cosθ=∣∣Ni∣∣∣∣Nj∣∣Ni⋅Nj=∑k=1lennki2×∑k=1lennkj2∑k=1len(nki×nkj),
n
k
i
n_{ki}
nki是用户k对物品i的评分, 没有评分则为0
(3)热门物品的惩罚
w
i
j
=
∣
N
(
i
)
∩
N
(
j
)
∣
∣
N
(
i
)
∣
α
⋅
∣
N
(
j
)
∣
1
−
α
w_{ij} = \frac{|N(i) \cap N(j)|}{|N(i)|^\alpha \cdot |N(j)|^{1-\alpha}}
wij=∣N(i)∣α⋅∣N(j)∣1−α∣N(i)∩N(j)∣,
α
∈
(
0
,
0.5
)
\alpha \in (0, 0.5)
α∈(0,0.5)
得到物品之间的相似度后,用如下公式计算用户u对物品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喜欢的物品集合,
S
(
j
,
k
)
S(j, k)
S(j,k)表示和j最相似的k个物品,
w
j
i
w_{ji}
wji表示物品j和物品i之间的相似度,
r
u
i
r_{ui}
rui表示用户u对物品i的评分
2. 基于用户的协同过滤算法
核心思想:找到和目标用户兴趣相似的用户集合,把这个用户集合中用户喜欢的,且目标用户没听说过的物品推荐给目标用户。
同理相似度计算:
w
u
v
=
∣
N
(
u
)
∩
N
(
v
)
∣
∣
N
(
u
)
∣
∣
N
(
v
)
∣
w_{uv} = \frac{|N(u) \cap N(v)|}{\sqrt{|N(u)||N(v)|}}
wuv=∣N(u)∣∣N(v)∣∣N(u)∩N(v)∣, N(u)表示用户u购买过的物品集合;
得到用户之间的相似度后,用如下公式计算用户u对物品i的预测分数;
p
u
i
=
∑
v
∈
N
(
i
)
∩
S
(
u
,
k
)
w
u
v
r
v
i
p_{ui} = \sum_{v \in N(i) \cap S(u, k)} w_{uv}r_{vi}
pui=∑v∈N(i)∩S(u,k)wuvrvi,
S
(
u
,
k
)
S(u, k)
S(u,k)表示与用户u最接近的k个用户;
3. 基于矩阵分解的推荐算法
流程
(1)加载用户对物品的评分矩阵
(2)矩阵分解,求奇异值,根据奇异值的能量占比确定降维至k的数值
(3)使用矩阵分解对物品评分矩阵进行降维
(4)使用降维后的物品评分矩阵计算物品相似度,对用户未评分过的物品进行预测
(5)产生前n个评分值高的物品,返回物品编号以及预测评分值
三、基于社交网路的推荐算法
1. 基于用户的推荐在社交网路的应用
(1)用共同好友比例计算相似度:
w
u
v
=
∣
o
u
t
(
u
)
∩
o
u
t
(
v
)
∣
∣
o
u
t
(
u
)
∣
∣
o
u
t
(
v
)
∣
w_{uv} = \frac{|out(u) \cap out(v)|}{\sqrt{|out(u)||out(v)|}}
wuv=∣out(u)∣∣out(v)∣∣out(u)∩out(v)∣, 其中
o
u
t
(
u
)
out(u)
out(u)代表用户u指向其他好友的集合(也即是用户u关注的人)
(2)使用共同被关注的用户数量计算相似度:
w
u
v
=
∣
i
n
(
u
)
∩
i
n
(
v
)
∣
∣
i
n
(
u
)
∣
∣
i
n
(
v
)
∣
w_{uv} = \frac{|in(u) \cap in(v)|}{\sqrt{|in(u)||in(v)|}}
wuv=∣in(u)∣∣in(v)∣∣in(u)∩in(v)∣,
i
n
(
u
)
in(u)
in(u)表示关注用户u的集合
(3)用户u关注的用户中,有多大比例也关注了用户v:
w
u
v
=
∣
o
u
t
(
u
)
∩
i
n
(
v
)
∣
∣
o
u
t
(
u
)
∣
w_{uv} = \frac{|out(u) \cap in(v)|}{|out(u)|}
wuv=∣out(u)∣∣out(u)∩in(v)∣,但是这个相似度有个缺点,所有人和大V有很大的相似度,所以为了降低大V和其他用户的相似度提出
w
u
v
=
∣
o
u
t
(
u
)
∩
i
n
(
v
)
∣
∣
o
u
t
(
u
)
∣
∣
i
n
(
v
)
∣
w_{uv} = \frac{|out(u) \cap in(v)|}{\sqrt{|out(u)||in(v)|}}
wuv=∣out(u)∣∣in(v)∣∣out(u)∩in(v)∣