影响力最大化RIS算法
简介
对于影响力最大化问题,我以前写过几个blog
影响力最大化 IC模型+贪心算法
影响力最大化 模拟爆发(粗糙笔记)
影响力最大化 IC 蒙特卡洛模拟 贪心算法
影响力最大化 IMRank 我心中的最优算法
影响力最大化 CELF 成本效益延迟转发算法
这篇文章主要是介绍一种解决静态网络的影响力最大化问题,RIS方法是Reverse Influence Sampling,反向影响力采样,这是我直译的,但是这个中文名字其实很真实的反映了这个算法的几个重点思想,在后面我们一一介绍。
RIS算法是2014年提出的,感兴趣的话大家可以去scholar搜一下。算是比较新的IM算法了。
随机反向可达集
我们用一个示例来进行展示,首先创建这样的一个图:
打印出来是这样的:
然后对上图进行采样,也就是生成一个01之间的随机数,如果某一条边比这个随机数高的话那么这条边就保留,否则就去掉。
于是我们得到这样的图:
这就完成了一次RIS采样。然后我们这样定义随机反向可达集(Random Reverse Reachable Set,以下称为RRS)
如上图所示,我们求的是v2的RRS,可见我们可以理解为,节点v的RRS中的任意节点u被激活都有可能激活节点v。RRS很好理解的。
关键就是如何求解RRS,在真正的应用中一般不会只求一个点的RRS,而是一个source点集的RRS。
求解RRS大致思路:
- new_set = [source], RRR_tmp = [source]
- while(new_set 不为空)
tmp = g[那些边的D是在source里面][‘O’]
RRR = list(set(RRR_tmp + tmp))
new_set = list(set(RRS) - set(RRR_tmp))
RRR_tmp = RRR[:]
return(RRR)
最大贪婪覆盖算法
其实这里不是要介绍这个算法,现在我们已经知道如何求解RRS了,接下来就需要用到最大贪婪覆盖算法来解决影响力最大化问题了。
首先我们不是要得到一个RRS,而是随机选择N个(一般N比较大,超过10000,越多正确率越高)source集合,然后得到N个RRS集合。在这N个RRS集合中我们使用最大贪婪算法:
RRS_list中有N个RRS
- for i in range(k):
#k表示要求解的seed集合中有几个元素。
寻找RRS_list中出现次数最多的v,添加到seed集合
将拥有v节点的RRS集合在RRS_list中删掉
return(seed)
在实现的代码中我使用的是词袋模型来找到出现次数最多的v。
算法近似比
在原来的博客中有朋友问到了近似比,原来一直没注意,我会在以后的图算法中增加这一个度量的分享。
很明显RIS算法得到的不是最优解,而是近似最优解,这时候就有一个重要的衡量:近似比。
假设一个最优化问题的最优解是c*,近似最优解是c,那么算法的近似比是:
通常情况下,这个性能近似比是输入规模n的函数:
RIS的近似比:
(1−1/e−ϵ)
时间复杂度
RIS的事件复杂度大大低于IC和CELF,这是有道理的。
我们可以这么想,CELF和IC都是通过贪心遍历然后得到局部最优解。随着n的增大事件复杂度暴增,这就是我觉得CELF和IC贪心是不太实用的传播模型。
但是RIS只在一开始进行一次生成RRS的遍历,然后在求解过程中并不存在后继的遍历计算。用论文中的一句话一开始生成的RRS用于通知网络内的节点扩展。
但是和IMRank算法的时间效率我不太确定,后面我会下一篇关于这两个的事件效率的比较。我先预测一下,我觉得IMRank会更快一些,但是随着n的增加不知道会呈现什么趋势。
源代码
大家共勉~