基于近邻的推荐算法是比较基础的算法,应用较为广泛,这里的近邻算法指的是协同过滤算法。包含基于用户的协同过滤算法(UserCF)和基于物品的协同过滤算法(ItemCF)。
协同过滤的核心思想就是基于相似性度量。
核心思想:先找到相似用户,再找到他们喜欢的物品。
给用户推荐 “和他兴趣相投的用户” 喜欢的物品。
这里以用户A、B、C、D对五个物品a、b、c、d、e的评分情况建立一张表:
用户 | 物品a | 物品b | 物品c | 物品d | 物品e |
---|---|---|---|---|---|
A | 3.0 | 4.0 | 0 | 3.5 | 0 |
B | 4.0 | 0 | 4.5 | 0 | 3.5 |
C | 0 | 3.5 | 0 | 0 | 3 |
D | 0 | 4 | 0 | 3.5 | 3 |
采用余弦相似度衡量用户之间的相似度,计算公式如下:
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)∣
上述公式中,u、v分别代表两个用户,N(u)表示用户u有过评分的物品集合。
下面计算用户C与其他用户的相似度:
W
C
A
=
∣
{
b
,
e
}
∩
{
a
,
b
,
d
}
∣
∣
{
b
,
e
}
∣
∗
∣
{
a
,
b
,
d
}
=
1
6
W_{CA}=\frac{|\{b,e\}\cap \{a,b,d\}|}{\sqrt{|\{b,e\}|*|\{a,b,d\}}}=\frac{1}{\sqrt{6}}
WCA=∣{b,e}∣∗∣{a,b,d}∣{b,e}∩{a,b,d}∣=61
W
C
B
=
∣
{
b
,
e
}
∩
{
a
,
c
,
e
}
∣
∣
{
b
,
e
}
∣
∗
∣
{
a
,
c
,
e
}
=
1
6
W_{CB}=\frac{|\{b,e\}\cap \{a,c,e\}|}{\sqrt{|\{b,e\}|*|\{a,c,e\}}}=\frac{1}{\sqrt{6}}
WCB=∣{b,e}∣∗∣{a,c,e}∣{b,e}∩{a,c,e}∣=61
W
C
D
=
∣
{
b
,
e
}
∩
{
b
,
d
,
e
}
∣
∣
{
b
,
e
}
∣
∗
∣
{
b
,
d
,
e
}
=
2
6
W_{CD}=\frac{|\{b,e\}\cap \{b,d,e\}|}{\sqrt{|\{b,e\}|*|\{b,d,e\}}}=\frac{2}{\sqrt{6}}
WCD=∣{b,e}∣∗∣{b,d,e}∣{b,e}∩{b,d,e}∣=62
所以我们得出D用户与C用户的相似度最大。
用户C进行评分的物品是b和c。那么接下来计算用户C对物品a、c、d的偏好程度:
P
(
C
,
a
)
=
w
C
A
∗
3.0
+
W
C
B
∗
4.0
+
W
C
D
∗
0
=
2.858
P(C,a)=w_{CA}*3.0+W_{CB}*4.0+W_{CD}*0=2.858
P(C,a)=wCA∗3.0+WCB∗4.0+WCD∗0=2.858
P
(
C
,
c
)
=
w
C
A
∗
0
+
W
C
B
∗
4.5
+
W
C
D
∗
0
=
1.837
P(C,c)=w_{CA}*0+W_{CB}*4.5+W_{CD}*0=1.837
P(C,c)=wCA∗0+WCB∗4.5+WCD∗0=1.837
P
(
C
,
d
)
=
w
C
A
∗
3.5
+
W
C
B
∗
0
+
W
C
D
∗
3.5
=
4.287
P(C,d)=w_{CA}*3.5+W_{CB}*0+W_{CD}*3.5=4.287
P(C,d)=wCA∗3.5+WCB∗0+WCD∗3.5=4.287
根据偏好程度给用户C推荐物品的顺序依次为d>a>c。
对于热门物品比如《高等数学》,并不能说明两个用户的喜好相似,所以要对热门物品进行一定的惩罚。可以用如下的公式进行计算:
W
u
v
=
∑
i
∈
N
(
u
)
∩
N
(
v
)
1
l
g
(
1
+
N
(
i
)
)
∣
N
(
u
)
∣
∗
∣
N
(
v
)
∣
W_{uv}=\frac{\sum_{i\in N(u)\cap N(v)} \frac{1}{lg(1+N(i))}} {\sqrt{|N(u)|*|N(v)|}}
Wuv=∣N(u)∣∗∣N(v)∣∑i∈N(u)∩N(v)lg(1+N(i))1
其中,N(i)是对物品i有过评分行为的用户集合。
核心思想:先找到用户喜欢的物品,再找到这些物品的相似物品。
给用户推荐他之前喜欢物品的相似物品。
仍采用上例中的数据,首先建立用户物品倒排表:
A-a-b-d
B-a-c-e
C-b-e
D-b-d-e
同现矩阵表示同时喜欢两个物品的用户数,根据用户物品倒排表计算得到:
a | b | c | d | e | |
---|---|---|---|---|---|
a | 0 | 1 | 1 | 1 | 1 |
b | 1 | 0 | 0 | 2 | 2 |
c | 1 | 0 | 0 | 0 | 1 |
d | 1 | 2 | 0 | 0 | 1 |
e | 1 | 2 | 1 | 1 | 0 |
采用如下公式计算item之间的相似度:
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)是喜欢物品i的用户数,分子表示同时喜欢物品i和j的用户数。
根据上述公式可以计算得到物品之间的相似度矩阵,这里略去。
用户C的评分矩阵:
物品 | 评分 |
---|---|
a | 0 |
b | 3.5 |
c | 0 |
d | 0 |
e | 3 |
构建相似度矩阵之后,ItemCF通过如下公式计算用户u对物品i的兴趣:
P
(
u
,
i
)
=
∑
j
∈
S
(
i
,
K
)
∩
N
(
u
)
w
i
j
r
u
j
P_{(u,i)}=\sum_{j \in S(i,K)\cap N(u)}w_{ij}r_{uj}
P(u,i)=j∈S(i,K)∩N(u)∑wijruj
N(u)是用户u喜欢的物品集合。
S(i,K)是和物品i最相似的K个物品集合。
w
i
j
w_{ij}
wij是物品i和j的相似度。$
r_{uj}$使用户u对物品j的兴趣,若用户u对物品j有过行为,则令其为1。
推荐结果为相似度矩阵和评分矩阵的乘积:
物品 | 推荐评分 |
---|---|
a | 3.25 |
b | 2.0 |
c | 3.0 |
d | 5.0 |
e | 2.33 |
那么除去b和e之外,为用户C推荐顺序为d>a>c。