影响力最大化 RIS 反向影响力采样算法

文章目录

  • 影响力最大化RIS算法
    • 简介
    • 随机反向可达集
    • 最大贪婪覆盖算法
    • 算法近似比
    • 时间复杂度
    • 源代码

影响力最大化RIS算法

简介

对于影响力最大化问题,我以前写过几个blog
影响力最大化 IC模型+贪心算法
影响力最大化 模拟爆发(粗糙笔记)
影响力最大化 IC 蒙特卡洛模拟 贪心算法
影响力最大化 IMRank 我心中的最优算法
影响力最大化 CELF 成本效益延迟转发算法

这篇文章主要是介绍一种解决静态网络的影响力最大化问题,RIS方法是Reverse Influence Sampling,反向影响力采样,这是我直译的,但是这个中文名字其实很真实的反映了这个算法的几个重点思想,在后面我们一一介绍。

RIS算法是2014年提出的,感兴趣的话大家可以去scholar搜一下。算是比较新的IM算法了。

随机反向可达集

我们用一个示例来进行展示,首先创建这样的一个图:

影响力最大化 RIS 反向影响力采样算法_第1张图片

打印出来是这样的:

影响力最大化 RIS 反向影响力采样算法_第2张图片

然后对上图进行采样,也就是生成一个01之间的随机数,如果某一条边比这个随机数高的话那么这条边就保留,否则就去掉。

影响力最大化 RIS 反向影响力采样算法_第3张图片

于是我们得到这样的图:

影响力最大化 RIS 反向影响力采样算法_第4张图片

这就完成了一次RIS采样。然后我们这样定义随机反向可达集(Random Reverse Reachable Set,以下称为RRS)

影响力最大化 RIS 反向影响力采样算法_第5张图片

如上图所示,我们求的是v2的RRS,可见我们可以理解为,节点v的RRS中的任意节点u被激活都有可能激活节点v。RRS很好理解的。

关键就是如何求解RRS,在真正的应用中一般不会只求一个点的RRS,而是一个source点集的RRS。

求解RRS大致思路:

  1. new_set = [source], RRR_tmp = [source]
  2. 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

  1. for i in range(k):
    #k表示要求解的seed集合中有几个元素。
    寻找RRS_list中出现次数最多的v,添加到seed集合
    将拥有v节点的RRS集合在RRS_list中删掉
    return(seed)

在实现的代码中我使用的是词袋模型来找到出现次数最多的v。

算法近似比

在原来的博客中有朋友问到了近似比,原来一直没注意,我会在以后的图算法中增加这一个度量的分享。

很明显RIS算法得到的不是最优解,而是近似最优解,这时候就有一个重要的衡量:近似比。

假设一个最优化问题的最优解是c*,近似最优解是c,那么算法的近似比是:

影响力最大化 RIS 反向影响力采样算法_第6张图片

通常情况下,这个性能近似比是输入规模n的函数:

在这里插入图片描述

RIS的近似比:
(1−1/e−ϵ)

时间复杂度

RIS的事件复杂度大大低于IC和CELF,这是有道理的。

我们可以这么想,CELF和IC都是通过贪心遍历然后得到局部最优解。随着n的增大事件复杂度暴增,这就是我觉得CELF和IC贪心是不太实用的传播模型。

但是RIS只在一开始进行一次生成RRS的遍历,然后在求解过程中并不存在后继的遍历计算。用论文中的一句话一开始生成的RRS用于通知网络内的节点扩展。

但是和IMRank算法的时间效率我不太确定,后面我会下一篇关于这两个的事件效率的比较。我先预测一下,我觉得IMRank会更快一些,但是随着n的增加不知道会呈现什么趋势。

源代码

传送门

大家共勉~

你可能感兴趣的:(数据挖掘,算法,影响力最大化,python,图计算)