微信公众号:[Dream–seeker]
关注可了解更多关于机器学习方面的知识,主要研究因果推断在机器学习中的应用;
推荐系统
当下正处于大数据时代,对互联网公司来说,数据就是他们的原材料,利用这些原材料他们可以提取出对他们有利的价值,从而制作各种**“产品”,而“推荐系统”**便是这些产品中的一个。现在各种app都利用着推荐系统向用户各种推荐(音乐,商品,电影…)。而你又是否跟我一样好奇这是怎么实现的呢?假如你也有兴趣,那就趁着空余时间跟着我一步一步去揭开这层面纱吧!
推荐系统的基础算法
推荐系统的基础算法还是挺多的,大致可分为三个大类①基于内容的推荐算法 ②基于协同的推荐算法 ③基于社交网络的推荐算法,接下来开始逐一来学习。
基于内容的推荐算法
该算法一般可以分为以下几个步骤:
一、特征(内容)提取:提取每个待推荐物品的特征(内容属性)
二、用户偏好计算:利用一个用户过去的显式评分或者隐式操作记录,计算用户不同特征(内容属性)上的偏好分数
三、内容召回:将待推荐物品的特征与用户偏好得分匹配,取出用户最有可能喜欢的物品池
四、物品排序:按用户偏好召回物品池,可能一次性挑选出很多内容,这时候可以进一步根据这些物品的平均评分进行排序
一、特征提取:①基础统计法 ②词频统计法
已知:有N个待推荐文章的集合为 D = { d 1 , d 2 , d 3 , . . . , d N } D={\{d_1,d_2,d_3,...,d_N\}} D={d1,d2,d3,...,dN},而所有文章中出现的词的集合为 T = { t 1 , t 2 , t 3 , . . . , t m } T=\{t_1,t_2,t_3,...,t_m\} T={t1,t2,t3,...,tm},也就是说我们有N篇待推荐的文章,而这些描述里包含了m个不同的词,我们最终要使用一个向量来表示每一篇文章,比如第j篇文章表示为 d j = { w 1 j , w 2 j , w 3 j , . . . . , w N j } d_j=\{w_{1j},w_{2j},w_{3j},....,w_{Nj}\} dj={w1j,w2j,w3j,....,wNj},其中w1j代表第一个词在第j篇文章中的权重,现在关键就是如何计算出 d j d_j dj各分量的值。
①基础统计方法
基础统计方法较为简单,其原理为:如果词 t 1 t_1 t1(集合T中第一个词)出现在第j篇文章中,就可以选取 w 1 j = 1 w_{1j}=1 w1j=1,相反则 w 1 j = 0 w_{1j}=0 w1j=0。
②词频统计法
w
k
,
j
=
T
F
−
I
D
F
(
t
k
,
d
j
)
∑
s
=
1
T
T
F
−
I
D
F
(
t
k
,
d
j
)
2
w_{k,j}=\frac{TF-IDF(t_k,d_j)}{\sqrt{\sum_{s=1}^{T}TF-IDF(t_k,d_j)^2}}
wk,j=∑s=1TTF−IDF(tk,dj)2TF−IDF(tk,dj)
其中
T
F
−
I
D
F
(
t
k
,
d
j
)
=
T
F
(
t
k
,
d
j
)
×
log
(
N
n
k
)
{TF-IDF(t_k,d_j)}=TF(t_k,d_j)\times\log(\frac{N}{n_k})
TF−IDF(tk,dj)=TF(tk,dj)×log(nkN),
T
F
(
t
k
,
d
j
)
TF(t_k,d_j)
TF(tk,dj)是第k个词在第j篇文章中出现的次数,出现得越多,代表该词越重要,从而TF值越大。
n
k
n_k
nk是包括第k个词的文章数量,
n
k
n_k
nk越少,代表该词越稀有,越能代表这篇文章,从而TF越大。
二、用户偏好计算
现在已经获得每篇文章的内容特征向量,形如
d
j
=
{
w
1
j
,
w
2
j
,
w
3
j
,
.
.
.
.
,
w
N
j
}
d_j=\{w_{1j},w_{2j},w_{3j},....,w_{Nj}\}
dj={w1j,w2j,w3j,....,wNj},下一步可以计算用户偏好的内容,比较直接的做法就是直接取用户喜欢的文章的内容特征向量取平均值。例:假设用户Z喜欢第1,3,5,7,篇文章,则该用户的内容特征向量为:
U
Z
=
(
d
1
+
d
3
+
d
5
+
d
7
)
/
4
=
(
u
Z
1
,
u
Z
2
,
.
.
.
,
u
Z
N
)
U_Z=(d_1+d_3+d_5+d_7)/4=(u_{Z1},u_{Z2},...,u_{ZN})
UZ=(d1+d3+d5+d7)/4=(uZ1,uZ2,...,uZN)。那么用户Z在文章j上的得分为
s
c
o
r
e
=
c
o
s
ϕ
=
U
z
×
d
t
∥
U
z
∥
×
∥
d
t
∥
=
∑
i
=
1
n
(
u
z
i
×
w
i
j
)
∑
i
=
1
n
u
z
i
2
×
∑
i
=
1
n
w
i
j
2
score=cos\phi=\frac{U_z\times d_t}{\|U_z\| \times \|d_t\|}=\frac{\sum_{i=1}^n (u_{zi}\times w_{ij})}{\sqrt{\sum_{i=1}^n {u_{zi}}^2}\times \sqrt{\sum_{i=1}^n w_{ij}^2}}
score=cosϕ=∥Uz∥×∥dt∥Uz×dt=∑i=1nuzi2×∑i=1nwij2∑i=1n(uzi×wij)
三、内容召回
基于上面的步骤,我们就可以预测出用户对所有待推荐的文章的评分,同时可以设置一个阈值,当某篇文章的预测分数大于某个阈值时,把文章放进物品池里面
四、物品排序
把物品池里面的文章按预测分数从高到底进行排序,进而挑选前k篇文章推荐给用户
基于协同的推荐算法
基于协同的推荐算法分为两种:一、基于物品的协同过滤:给用户推荐那些和他们之前喜欢的物品的相似物品 二、基于用户的协同过滤:先计算用户U与其他的用户的相似度,然后取和U最相似的几个用户,把他们购买过的物品推荐给用户U
一、基于物品的协同过滤
1、计算物品之间的相似性度:①基于共同喜欢物品用户列表计算 ②基于余弦的相似度计算
①基于共同喜欢物品用户列表计算:
w
i
j
=
∣
N
(
i
)
∩
N
(
j
)
∣
∣
N
(
i
)
∣
×
∣
N
(
j
)
∣
w_{ij}=\frac{|N(i)\cap N(j)|}{\sqrt{|N(i)|\times|N(j)|}}
wij=∣N(i)∣×∣N(j)∣∣N(i)∩N(j)∣
其中
∣
N
(
i
)
∣
和
∣
N
(
j
)
∣
{|N(i)|和|N(j)|}
∣N(i)∣和∣N(j)∣分别为购买物品
i
i
i和
j
j
j的人数,而
∣
N
(
i
)
∩
N
(
j
)
∣
{|N(i)\cap N(j)|}
∣N(i)∩N(j)∣ 为同时购买
i
i
i和
j
j
j的人数,当同时购买这两个物品的人越多,他们的相似度就越高。
为了防止某个物品很热门,导致它经常与其他物品一起购买,对上式进行改进(进行惩罚):
w
i
j
=
∣
N
(
i
)
∩
N
(
j
)
∣
∣
N
(
i
)
∣
α
×
∣
N
(
j
)
∣
1
−
α
w_{ij}=\frac{|N(i)\cap N(j)|}{|N(i)|^\alpha\times|N(j)|^{1-\alpha}}
wij=∣N(i)∣α×∣N(j)∣1−α∣N(i)∩N(j)∣
当α越小,N(i)越小,惩罚得越厉害。
②基于余弦的相似度计算:
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\phi=\frac{N_i\times N_j}{\|N_i\| \times \|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}}
w(ij)=cosϕ=∥Ni∥×∥Nj∥Ni×Nj=∑k=1lennki2×∑k=1lennkj2∑k=1len(nki×nkj)
其中
n
k
i
n_{ki}
nki是用户
k
k
k对物品
i
i
i的评分,如果没有评分则为0
2、计算用户u对物品i的预测分数:
p
i
j
=
∑
i
∈
N
(
u
)
∩
S
(
j
,
k
)
w
i
j
×
s
c
o
r
e
u
i
p_{ij}=\sum_{i\in N(u)\cap S(j,k)} w_{ij}\times score_{ui}
pij=i∈N(u)∩S(j,k)∑wij×scoreui
其中
N
(
u
)
N(u)
N(u)表示用户
U
U
U喜欢的物品的集合,
S
(
j
,
k
)
S(j,k)
S(j,k)是物品
j
j
j相似物品的集合(前
k
k
k个得分最高的),
s
c
o
r
e
u
i
score_ui
scoreui是用户
U
U
U对物品
i
i
i的评分
二、基于用户的协同过滤
1、计算用户之间的相似性度:
w
a
b
=
∣
N
(
a
)
∩
N
(
b
)
∣
∣
N
(
a
)
∣
×
∣
N
(
b
)
∣
w_{ab}=\frac{|N(a)\cap N(b)|}{\sqrt{|N(a)|\times|N(b)|}}
wab=∣N(a)∣×∣N(b)∣∣N(a)∩N(b)∣
其中
N
(
a
)
N(a)
N(a)表示用户
a
a
a购买物品的数量,
N
(
b
)
N(b)
N(b)同理,
∣
N
(
a
)
∩
N
(
b
)
∣
|N(a)\cap N(b)|
∣N(a)∩N(b)∣表示用户
a
、
b
a、b
a、b购买相同物品的数量
2、计算用户U对物品i的预测分数:
p u i = ∑ v ∈ N ( i ) ∩ S ( u , k ) w v u × s c o r e v i p_{ui}=\sum_{v\in N(i)\cap S(u,k)} w_{vu}\times score_{vi} pui=v∈N(i)∩S(u,k)∑wvu×scorevi
总结
敲公式敲到眼睛要瞎了,暂时就到这里了,毕竟我这两天才看,也才看到这里而已,写出来主要还是为了更好的去理解内容,同时可以记录下学过的内容,方便以后查找。有空会慢慢记录自己读研期间学过的内容,希望这一次不再是三分钟热度!