基于物品的协同过滤是目前业界应用最多的算法。
可以通过下面公式定义物品的相似度:
w
i
,
j
=
∣
N
(
i
)
∩
N
(
j
)
∣
∣
N
(
i
)
∣
∣
N
(
j
)
∣
w_{i,j}=\frac{|N(i) \cap N(j)|}{\sqrt{|N(i)||N(j)|}}
wi,j=∣N(i)∣∣N(j)∣∣N(i)∩N(j)∣
这里,分母
∣
N
(
i
)
∩
N
(
j
)
∣
|N(i) \cap N(j)|
∣N(i)∩N(j)∣是同时喜欢物品i和物品j的的用户数。为了减轻热门物品的影响,除以
∣
N
(
i
)
∣
∣
N
(
j
)
∣
\sqrt{|N(i)||N(j)|}
∣N(i)∣∣N(j)∣,惩罚了被很多用户喜欢的热门商品。
笛卡尔乘积
同时喜欢物品i和物品j的用户数,可以使用笛卡尔乘积来实现。
笛卡尔乘积是指在数学中,两个集合
X
X
X和
Y
Y
Y的笛卡尔积(Cartesian product),又称直积,表示为
X
×
Y
X×Y
X×Y,第一个对象是
X
X
X的成员而第二个对象是
Y
Y
Y的所有可能有序对的其中一个成员。
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
笛卡尔乘积在SQL中通过JOIN来实现。
Jaccard距离
是衡量两个集合相似度的算法,用两个集合的交集元素的个数占并集元素个数的比例来表示。
J
(
X
,
Y
)
=
∣
X
∩
Y
∣
∣
X
∪
Y
∣
J(X,Y)=\frac{|X \cap Y|}{|X \cup Y|}
J(X,Y)=∣X∪Y∣∣X∩Y∣
集合可以用布尔向量表示,所以当向量为布尔值时,计算向量相似度可以使用Jaccard距离。
大概在3年前我有一段时间一直在思考频繁项集挖掘和CF的本质区别是什么,包括还在一个会上问过周涛,他当时给我的说法是频繁项集挖掘算法复杂度太高了,一般实际中很少应用,效果可能会稍好。现在让我来看没有本质区别,因为本质都是挖掘item的co-occurence,包括各种proximity的计算方式,全集的二跳节点是相同的(而二跳节点有几万个),不同的是top-k。swing和其他传统方法最大的区别就是除了co-occurence,它考虑了网络本身的外延结构。频繁项集挖掘除了Apriori,还有PFP-growth,但是计算量仍然庞大,数据集小可以尝试。