给定用户
u
u
u和用户
v
v
v,令
N
(
u
)
N(u)
N(u)表示用户
u
u
u点击过的物品集合,令
N
(
v
)
N(v)
N(v)为用户
v
v
v点击过的物品集合
余弦相似度
W
u
,
v
=
∣
N
(
u
)
⋂
N
(
v
)
∣
∣
N
(
u
)
∣
∣
N
(
v
)
∣
W_{u,v} = \frac{|N(u) \bigcap N(v)|} {\sqrt{|N(u)| | N(v)|}}
Wu,v=∣N(u)∣∣N(v)∣∣N(u)⋂N(v)∣ 其中
∣
∗
∣
|*|
∣∗∣表示取模,即物品的个数。
Jaccard公式
W
u
,
v
=
∣
N
(
u
)
⋂
N
(
v
)
∣
∣
N
(
u
)
⋃
N
(
v
)
∣
W_{u,v} = \frac{|N(u) \bigcap N(v)|} {|N(u) \bigcup N(v)|}
Wu,v=∣N(u)⋃N(v)∣∣N(u)⋂N(v)∣ 【例】根据上述数据,生成每个用户购买过的商品列表
可据此计算用户相似度,例如计算用户A和B的余弦相似度
W
A
,
B
=
∣
{
1
,
2
,
5
}
⋂
{
1
,
3
,
4
}
∣
∣
{
1
,
2
,
5
}
∣
∣
{
1
,
3
,
4
}
∣
=
1
3
W_{A,B} = \frac{| \{1,2,5\} \bigcap \{1,3,4\} |} {\sqrt{| \{1,2,5\}| | \{1,3,4\} |}} = \frac{1} {3}
WA,B=∣{1,2,5}∣∣{1,3,4}∣∣{1,2,5}⋂{1,3,4}∣=31 上面公式中需要对任意两个用户计算相似度,这种方法的时间复杂度是
O
(
U
2
)
O(U^2)
O(U2),其中
U
U
U标识用户数。当用户数量大时,计算起来会很费时。其实,并不是所有用户购买过的物品都有交集,即存在
∣
N
(
u
)
⋂
N
(
v
)
∣
=
0
|N(u) \bigcap N(v)|=0
∣N(u)⋂N(v)∣=0。因此,可以先计算出
∣
N
(
u
)
⋂
N
(
v
)
∣
≠
0
|N(u) \bigcap N(v)| \neq 0
∣N(u)⋂N(v)∣=0的用户对
(
u
,
v
)
(u,v)
(u,v),然后再除以相似度中的分母得到用户的相似度矩阵。
用户相似度计算的步骤如下:
建立物品到用户的倒排表,对于每个物品,保存购买过该物品的用户列表; 【例】生成商品到用户的倒排表
初始化用户相似度矩阵
W
W
W为
U
∗
U
U*U
U∗U维度的全零矩阵,遍历倒排表,对每个物品对应的用户列表求2个元素的排列,然后将每个排列值作为
W
W
W的索引进行加1。(例如物品I对应的用户列表为[a,b],则排列为{(a,b)},更新
W
[
a
]
[
b
]
=
W
[
a
]
[
b
]
+
1
W[a][b]=W[a][b]+1
W[a][b]=W[a][b]+1和$
W
[
b
]
[
a
]
=
W
[
b
]
[
a
]
+
1
W[b][a]=W[b][a]+1
W[b][a]=W[b][a]+1) 【例】根据倒排表生成用户间相同商品购买量统计矩阵
步骤2执行结束后,得到的是每个用户与其他用户购买相同商品的个数,即相似度的分子,要计算相似度,还需要处于分母。以余弦相似度为例,遍历
W
W
W的下三角矩阵(或是上三角矩阵),计算
s
i
m
u
,
v
=
W
[
u
]
[
v
]
/
∣
N
(
u
)
∣
∣
N
(
v
)
∣
sim_{u,v}=W[u][v] / \sqrt{|N(u)||N(v)|}
simu,v=W[u][v]/∣N(u)∣∣N(v)∣,其中
u
,
v
u,v
u,v为
W
W
W的索引。更新
W
[
u
]
[
v
]
=
W
[
v
]
[
u
]
=
s
i
m
u
,
v
W[u][v] = W[v][u] = sim_{u,v}
W[u][v]=W[v][u]=simu,v。 【例】 除以计算相似度的分母,得到相似度矩阵
2. 生成推荐列表
根据用户相似度,计算待推荐用户
u
u
u对与其最相似的
K
K
K个用户购买过商品
i
i
i的感兴趣程度:
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_{u,v}r_{v,i}
p(u,i)=v∈S(u.K)⋂N(i)∑Wu,vrv,i其中,
S
(
u
.
K
)
S(u.K)
S(u.K)为和用户
u
u
u兴趣最接近的
K
K
K个用户,
r
v
,
i
r_{v,i}
rv,i代表用户对物品
i
i
i的兴趣,因为只是用了行为数据,所以
r
v
,
i
=
1
r_{v,i}=1
rv,i=1. 【例】生成推荐列表