基于物品的协同过滤算法itemCF
基本思想
该算法向用户推荐与他们之间喜欢的物品相似的其它物品,例如,如果你购买过《数据挖掘导论》,会向你推荐《机器学习》。
itemCF算法通过计算用户的历史行为记录,来分析物品之间的相似度:如果喜欢物品a的用户大多数也喜欢物品b,那么认为物品A与物品B具有一定的相似度。这就很容易为推荐结果做出合理的解释。
假设,
N
(
a
)
N(a)
N(a)和
N
(
b
)
N(b)
N(b)分别是喜欢物品A和物品B的用户数量,
∣
N
(
a
)
⋂
N
(
b
)
∣
|N(a) \bigcap N(b)|
∣N(a)⋂N(b)∣是既喜欢物品a又喜欢物品b的用户数量,那么物品A和物品B的相似度为:
w
a
b
=
∣
N
(
a
)
⋂
N
(
b
)
∣
∣
N
(
a
)
∣
w_{ab} = \frac {|N(a) \bigcap N(b)|} {|N(a)|}
wab=∣N(a)∣∣N(a)⋂N(b)∣
上述公式有个问题:如果B是个很热门的商品,那么将会接近于1(因为喜欢A的人都喜欢B),这会造成任何其他物品与某个热门物品都很相似。因此,我们对公式作一些修改,加上一个惩罚物品B的权重因子,得到了如下公式:
w
a
b
=
∣
N
(
a
)
⋂
N
(
b
)
∣
∣
N
(
a
)
∣
∣
N
(
b
)
∣
w_{ab} = \frac {|N(a) \bigcap N(b)|} {\sqrt {|N(a)||N(b)|}}
wab=∣N(a)∣∣N(b)∣∣N(a)⋂N(b)∣
计算过程
假设物品的全集是 I I I,首先初始化一个 ∣ I ∣ × ∣ I ∣ |I|\times|I| ∣I∣×∣I∣的全零矩阵C:
a | b | c | d | f | |
---|---|---|---|---|---|
a | 0 | 0 | 0 | 0 | 0 |
b | 0 | 0 | 0 | 0 | 0 |
c | 0 | 0 | 0 | 0 | 0 |
d | 0 | 0 | 0 | 0 | 0 |
f | 0 | 0 | 0 | 0 | 0 |
对于用户-物品兴趣列表:
A
a
b
d
B
a
c
f
C
a
c
d
D
b
d
\begin{matrix} A & a & b & d\\ B & a & c & f\\ C & a & c & d\\ D & b & d \end{matrix}
ABCDaaabbccddfd
如果物品对(x, y)出现在某个用户的兴趣列表中,则将 C [ x ] [ y ] C[x][y] C[x][y]和 C [ y ] [ x ] C[y][x] C[y][x]都加1,如此遍历之后,得到最终的矩阵:
a | b | c | d | f | |
---|---|---|---|---|---|
a | 0 | 1 | 2 | 2 | 1 |
b | 1 | 0 | 0 | 2 | 0 |
c | 2 | 0 | 0 | 1 | 1 |
d | 2 | 2 | 1 | 0 | 0 |
f | 1 | 0 | 1 | 0 | 0 |
在得到了物品两两之间的相似度后,itemCF通过以下公式来计算用户u对物品i的兴趣度。
p
u
i
=
∑
j
∈
N
(
u
)
⋂
S
(
i
,
k
)
w
i
j
r
u
j
p_{ui} = \sum_{j \in N(u) \bigcap S(i, k)} w_{ij}r_{uj}
pui=j∈N(u)⋂S(i,k)∑wijruj
假设
N
(
u
)
N(u)
N(u)是用户喜欢的物品集合,
S
(
i
,
K
)
S(i, K)
S(i,K)是与物品i最相似的K个物品的集合,
w
i
j
w_{ij}
wij是物品i与物品j的相似度,
r
u
j
r_{uj}
ruj是用户u对物品j的兴趣(对于隐反馈数据集,如果用户u对物品j产生过行为,则可令
r
u
j
=
1
r_{uj}=1
ruj=1),
p
u
i
p_{ui}
pui是用户u对物品i的兴趣。
算法参数
参数K是ItemCF算法的重要参数,它对推荐算法的各种指标都会产生一些列的影响:
精度(准确率和召回率):准确率和召回率与参数k并不呈正相关或者负相关,但是选择合适的K对于获得推荐系统高的精度比较重要。
流行度:随着K的增大,推荐结果的流行度会逐渐提高,但是当K增加到一定的程度,流行度就不会再有明显变化。
覆盖率:K越大,覆盖率会相应地降低。
用户活跃度对物品相似度的影响(itemCF-IUF)
在ItemCF中,两个物品之间能产生相似度是因为它们共同出现在了多个用户的兴趣物品列表中,因此用户会对其兴趣列表中的两两物品的相似度产生贡献。但是,不同的用户的贡献是不相同的。
例如,图书馆管理员买了京东上90%的图书,但绝大部分都不是他的兴趣;而一个文艺青年买了5本小说,但都是他的兴趣。所以,图书管理员对他所买的书的两两相似度,要远远小于文艺青年。
因此,活跃的用户,相比起不活跃的用户而言,对物品之间相似度的贡献更小。John S. Breese在论文中提出了IUF(Inverse User Frequence)的概念。假设N(u)是用户u喜欢的物品列表,那么用户u的IUF参数为:
1
log
(
1
+
∣
N
(
u
)
∣
)
\frac 1 {\log {(1 + |N(u)|)}}
log(1+∣N(u)∣)1
增加了IUF参数的物品相似度公式为:
w
A
B
=
∑
u
∈
N
(
A
)
⋂
N
(
B
)
1
log
(
1
+
N
(
u
)
∣
∣
)
∣
N
(
A
)
∣
∣
N
(
B
)
∣
w_{AB} = \frac {\sum_{u \in N(A) \bigcap N(B)} \frac 1 {\log (1 + N(u)||)}} {\sqrt{|N(A)||N(B)|}}
wAB=∣N(A)∣∣N(B)∣∑u∈N(A)⋂N(B)log(1+N(u)∣∣)1
该算法记为itemCF-IUF。
实际上,对于过于活跃的用户,例如上面的图书管理员,一般直接忽略其兴趣物品列表,不将其纳入到相似度计算的数据集中。
物品相似度的归一化处理
Karypis在论文中提到:在ItemCF中,如果将相似度矩阵按照最大值进行归一化处理(将最大值设为1行不行?),那么可以提高推荐的准确率。
除了提高推荐结果的准确率外,归一化还能够提高推荐结果的覆盖率和多样性。
w
i
j
′
=
w
i
j
max
w
i
j
w_{ij}^{'} = \frac {w_{ij}} {\max w_{ij}}
wij′=maxwijwij
除了提高推荐结果的准确率外,归一化还能提高推荐结果的覆盖率和多样性。
举例
假设有两类物品A和B,A类物品之间的相似度为0.5,B类物品之间的相似度为0.6,A类物品和B类物品之间的相似度为0.2。在这种情况下,如果某用户喜欢5个A类物品和5个B类物品,那么ItemCF算法会向该用户推荐B类物品,因为B类物品之间的相似度比较大。对相似度进行归一化处理后,A类物品之间的相似度变成了1,B类物品之间的相似度也是1,在这种情况下,如果用户喜欢5个A类物品和5个B类物品,那么系统向他推荐的A类物品和B类物品的数量应该是大致相等的。
什么样的类其类内物品之间的相似度较高,什么样的类其类内物品之间的相似度较低?
一般来说,越是热门的类,其类内物品的相似度越大,如果不进行归一化,那么就会倾向于推荐热门类里的物品,造成推荐的覆盖率低。
ItemCF算法的缺陷
上面提到:越是热门的类,其类内物品的相似度越大。除此之外,不同领域的最热门物品之间的相似度往往也是很高的。
举例
老一辈人喜欢看新闻联播,不看其他新闻节目。他们在看完新闻联播后,立刻换台去看中央8套的国产电视剧,其他电视剧(如偶像剧)几乎不看。那么,通过ItemCF算法得到的数据,我们很容易认为新闻联播与黄金时段的电视剧的相似度很高,而新闻联播与其他新闻节目(如南京零距离)的相似度很低。这显然是不合理的。
对于这类问题,仅仅靠用户数据是不能解决的,必须引入物品的内容数据。这超出了协同过滤的范围。