zoukankan      html  css  js  c++  java
  • 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,然后重复上述过程。

  • 相关阅读:
    关于java.lang.OutOfMemoryError: Java heap space的错误分析
    对TCP/IP网络协议的深入浅出归纳
    leetcode面试准备:Contains Duplicate I && II
    leetcode面试准备:Count Complete Tree Nodes
    leetcode面试准备: Jump Game II
    leetcode面试准备: Jump Game
    LeetCode解题报告:Linked List Cycle && Linked List Cycle II
    最小栈的实现与优化
    面试:归并排序
    leetcode面试准备:Decode Ways
  • 原文地址:https://www.cnblogs.com/aaronhoo/p/6548760.html
Copyright © 2011-2022 走看看