CELF算法原理
影响力传播模型中的独立层叠模型(independent cascading model,IC模型),影响力传播过程中,种子的影响力具备子模性(submodularity),即种子的边际影响力增量会呈现递减趋势,CELF算法(Cost-effective Lazy-forward)利用这个发现改进了Kempe&Kleinberg的原始的Greedy算法,使得算法的速度大幅提升。下面说说具体是怎么回事。
原始的Greedy算法:
input:图G={V,E},种子集合Seeds=空集,种子数量K
output:种子集合Seeds={K个影响力最大的种子}
step 1:在Seeds为空的条件下,一次算出G中每个节点V的边际影响力Δinfs【节点n的Δinfs=(n加入当前种子集Seeds后形成的新种子集Seeds的影响力)-(当前Seeds的影响力)】,并把各个节点按照Δinfs降序排列。
step 2:把Δinfs最大的节点加入Seeds。例如下图中A的边际影响力最大,于是Seeds={A}.
step 3:在新种子集Seeds条件下,重新计算各个节点的边际影响力Δinfs,把Δinfs最大的加入种子集。
step 4:重复step 3,直至种子集的节点个数达到K,输出Seeds,退出。
而CELF算法:根据IC模型条件下,节点的Δinfs符合子模性,于是在A加入Seeds后,在下一轮计算各个节点的边际影响力Δinfs时,如果计算出B的Δinfs大于或等于【上一轮中比它小且最接近它的那个节点(这里是节点C)】在上一轮中的Δinfs,那么这一轮就可以直接把B加入到Seeds当中,而不用计算后面C,D,E...等节点在这一轮的Δinfs了,因为他们在这一轮的Δinfs必定比上一轮自己的Δinfs小,所以B就是这一轮最大的,所以选B没错,因此节省了很多计算步骤。
具体到下图中,如果Δb>=8,那么B就是Δinfs最大的节点,B可直接加入Seeds,不用再计算Δc,Δd,Δe等等,因为依据子模性(即边际递减规律),种子集Seeds加入了A之后,Δc必定小于等于8,Δd必定小于等于7,Δe必定小于等于5。这就是CELF算法能节省时间提高速度的原因。
那,如果这一轮B的Δinfs没有大于或者等于8呢?就逐个算出每个节点的Δinfs,排序再挑最大的,放进Seeds,然后重复上述过程。