一.问题
源于生活的问题
许多应用程序中, 数据对象可以表示为集(set)。例如, 在视频点播和社交网络服务中,用户数据由一组分别已观看的电影和一组用户 (朋友) 组成, 它们可用于推荐和信息提取。因此, 集相似自联接问题得到了广泛的研究。现有的研究假定集是静态的,但在上述应用程序中, 集是动态更新的, 这需要不断更新联接结果。如果采用原始的静态集合更新方法去更新动态集合,代价无疑是巨大的,因此我们需要寻求一种更高效,更适用于动态集合更新的方法.
简而言之,根据集合元素来确定集合的相似性;在集合元素处于动态变化时我们需要高效的算法来重新计算集合之间相似性.
问题的形式定义
-
给定一个用户集合: S = s 1 , s 2 , s 3 , … , s n S = {s_1,s_2,s_3,\dots,s_n} S=s1,s2,s3,…,sn
-
每个 s i s_i si拥有多个元素: s i = e 1 , e 2 , e 3 , … , e n s_i= {e_1,e_2,e_3,\dots,e_n} si=e1,e2,e3,…,en
-
给定一个相似度计算方法:通常考虑的雅Jaccard 相似性 和 Cosine相似性.
其中
J a c ( s , s ′ ) = ∣ s ∩ s ′ ∣ ∣ s ∪ s ′ ∣ C o s ( s , s ′ ) = ∣ s ∩ s ′ ∣ ∣ s ∣ ⋅ ∣ s ′ ∣ Jac(s,s') = \frac{|s \cap s'|}{|s\cup s'|} \\ Cos(s,s') = \frac{|s \cap s'|}{\sqrt{|s| \cdot |s'|}} \\ Jac(s,s′)=∣s∪s′∣∣s∩s′∣Cos(s,s′)=∣s∣⋅∣s′∣∣s∩s′∣
- 再给定最近邻的数目k,求出每个 s i s_i