协同过滤算法的简单理解
本文主要是讲解一下《推荐系统实践》中UserCF和ItemCF这两种基于领域的推荐算法,写出自己的理解。
-
UserCF(基于用户的协同过滤算法)
这种推荐算法的出发点很简单。举个例子,一名用户A喜欢泰勒斯威夫特、林俊杰、张杰和Post Malone。而另一名用户B喜欢Post Malone、林俊杰和周杰伦…。那么这两名用户是存在一定相似度的(兴趣爱好差不多),那么如果系统为A推荐周杰伦这个歌手的歌,是不是很有可能用户A也会喜欢。所以这个算法步骤如下:
- 找到跟某个用户具有较高相似度的K个用户集合;
- 把K个用户中目标用户没有听说过的物品推荐给目标用户;
用户相似度的计算公式:(余弦相似度)
w u v = ∣ N ( u ) ⋂ N ( v ) ∣ N ( u ) ∣ ∣ N ( v ) ∣ ∣ w_{uv} = |\frac{N(u)\bigcap N(v)}{\sqrt{|N(u)| |N(v)|}}| wuv=∣∣N(u)∣∣N(v)∣N(u)⋂N(v)∣
参数描述N(u)是u用户喜欢的物品的集合,而N(v)是v用户喜欢的用户结合。|N(u)|、|N(v)|是指集合长度。讲完这个简单的,就说一下那么物品-用户倒排表(这玩意我一开始看的都蒙了)
书中的例子是这样的:
黑色圆圈就是用户、后面跟的是喜欢的物品。将其转换为物品-用户倒排表(就是这个物品,有谁喜欢)。构造出书中写的用户相似度矩阵W(其实就是两个用户喜欢商品的交集长度是多少),比如说倒排表中的物品a,有A与B用户喜欢,那么矩阵中
W
[
A
]
[
B
]
W[A][B]
W[A][B]和
W
[
B
]
[
A
]
W[B][A]
W[B][A]这两个位置+1,那么如果此时我把C喜欢的物品加上a后呢,那么就会出现三种组合
W
[
A
]
[
B
]
、
W
[
B
]
[
A
]
、
W
[
A
]
[
C
]
、
W
[
C
]
[
A
]
、
W
[
B
]
[
C
]
、
W
[
C
]
[
B
]
W[A][B]、 W[B][A]、 W[A][C]、 W[C][A]、 W[B][C]、 W[C][B]
W[A][B]、W[B][A]、W[A][C]、W[C][A]、W[B][C]、W[C][B]的位置都要+1。构造这样的矩阵为了就是减少重复计算那些用户交集为零的用户组合。
最后就是推荐:
P
(
u
,
i
)
=
∑
v
∈
S
(
u
,
K
)
⋂
N
(
i
)
w
u
v
r
v
i
P(u,i) = \sum_{v\in S(u,K)\bigcap{N(i)}} w_{uv}r_{vi}
P(u,i)=v∈S(u,K)⋂N(i)∑wuvrvi
S
u
,
K
S_{u,K}
Su,K就是跟用户u最相似的K个用户集合;
N
(
i
)
N(i)
N(i)就是对商品i有过行为的集合;
r
r
r就是用户v是否喜欢商品
i
i
i咯,这书上喜欢就1,不喜欢就是0.然后就可以计算用户u,对商品i的兴趣度了。
-
基于物品的协同过滤算法
讲到这个算法,我反正第一印象就是说,噢,根据物品的标签或者内容来推荐呗。比如说计算机书籍就推送计算机书籍,医学书籍就推送医学书籍,这样理解这个算法是不对滴。这个算法名字叫啥?基于物品的***协同过滤***算法,我们要从这个“协同”这两个字下手呀。协同协同肯定得有用户参与啊,不然商品自己跟谁协同,所以我们并不是通过所谓的标签或者内容来推送。我们评价物品A跟物品B相似不是因为内容相似或者标签相似,而是喜欢商品A的用户也喜欢商品B,我们就可以说这两个商品相似呗。举个例子,很多程序员都买过《数据库原理》这本书(瞎掰的),也购买了《如何预防脊椎病》这本书,那么我们可以说这两本书相似。懂这意思了吧,我们站在商品的角度,去看用户购买数量。我个人感觉就是把UserCF反转了。
话不多说上物品相似度公式:
w i , j = ∣ N ( i ) ⋂ N ( j ) ∣ ∣ N ( i ) ∣ w_{i,j} = \frac{|N(i) \bigcap N(j)|}{|N(i)|} wi,j=∣N(i)∣∣N(i)⋂N(j)∣
N ( i ) N(i) N(i)就是喜欢商品 i i i的人; N ( j ) N(j) N(j)就是喜欢商品 j j j的人;这样可以算出两个物品的相似度了。但是有一个问题,如果我去计算的商品 j j j是一个热门商品(很多人都喜欢这个商品),那么整个 w i , j w_{i,j} wi,j就趋近1了。那么对于致力于把长尾效应发挥更好的推荐系统就不好了。所以公式就改成了:
w i , j = ∣ N ( i ) ⋂ N ( j ) ∣ ∣ N ( i ) ∣ ∣ N ( j ) ∣ w_{i,j} = \frac{|N(i) \bigcap N(j)|}{\sqrt{|N(i)||N(j)|}} wi,j=∣N(i)∣∣N(j)∣∣N(i)⋂N(j)∣
这样就惩罚了一下热门商品的权重啦。老样子,还是要构造矩阵。计算喜欢某个商品的人数好算,交集就难了如果暴力还是会出现重复计算啦。
图中我画圈的地方,应该是漏写了吧(也有可能我买到了假书)。同理每个用户做一个矩阵图,商品两两组合,然后把这么多矩阵对应位置加起来就完事了。得到最后的矩阵。最后的矩阵每个点就代表,同时喜欢商品a(矩阵行标))和商品d(矩阵列标)的用户有两个。
用户u对物品j的兴趣计算公式:
P
(
u
j
)
=
∑
i
∈
N
(
u
)
⋂
S
(
j
,
K
)
w
j
i
r
u
i
P(uj) = \sum_{i\in N(u)\bigcap{S(j,K)}} w_{ji}r_{ui}
P(uj)=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
K
K个物品集合(累加符号下面的公式,我没懂它的含义,但是课本后面举的例子倒是挺容易懂得)。
w
j
,
i
w_{j,i}
wj,i是物品
j
j
j和
i
i
i的相似度,
r
u
i
r_{ui}
rui是用户u对物品i的兴趣。显式数据的话,就是0或1的。
例子如下:
反正我看完之后虽然知道算了,但是那个公式还是没能看懂…