影响力最大化 IC 蒙特卡洛模拟 贪心算法

简介

个人对于影响力最大化这个问题本身比较感兴趣,这是我原来写过的链接:

影响力最大化 IC模型+贪心算法
影响力最大化 模拟爆发(粗糙笔记)
影响力最大化 IC 蒙特卡洛模拟 贪心算法
影响力最大化 IMRank 我心中的最优算法
影响力最大化 CELF 成本效益延迟转发算法

这一偏还是基于贪心算法的IC模型,但是原来写的是基于LT的IC,也就是线性阈值的独立级联模型。
而这一篇我使用的是蒙特卡洛模拟的方法实现IC。那么我们就先来看看到底有什么区别。

IC 独立级联算法

首先我们得知道独立级联算法,这里我不过多解释了,因为其实这是很常见很普通的概念,大家不妨记住,后面慢慢理解。

独立级联模型(Independent Cascade Mode,IC模型)是一种概率模型,当一个节点v被激活时,它会以概率p[v,w]对它未激活的出边邻居节点w尝试激活,这种尝试仅仅进行一次,而且这些尝试之间是互相独立的,即v对w的激活不会受到其他节点的影响。

其中一定要记住的是“独立”的概念,这种思路其实我认为是IC的灵魂,不是说多么高级,只是这是IC实现的基础。有利于理解IC。

蒙特卡洛和LT线性阈值

这是两种实现IC的思路:
什么意思呢? 我们举个例子:
如下图所示:
在这里插入图片描述
在线性阈值的情况下,我们为每一个节点设置一个阈值T(这里我们设置为1)。对于上图节点二来说,如果此时1和0已经被激活,那么节点2的激活能力 = P[1,2] weight[1] + P[0,2] weight[0],当然如果简化来说的话,也可以不乘每个点的权重。由此我们就可以计算出来当遍历一遍之后,未激活点的存储的激活能力。

然后每个点的激活能力和T进行比较,如果超过了T就说明该点已经被激活,我们将它放入S集合中。最后得到的S的个数就是影响力大小。

对于蒙特卡洛模拟来说,其实大家可以看看我原来的一篇 模拟爆发的文章,那个时候我以为叫模拟爆发,其实就是蒙特卡洛模拟。这种方法更加暴力。
还是用刚才的例子,此时0、1节点已经被激活,那么我们现在只看节点2的激活情况,此时生成两个随机数random1、random2(0 < random < 1),
if(random1 > p[0,2] or random2 > p[1, 2])then 节点2被激活

这就是两种方法的区别。
所以,接下来:

实现基于蒙特卡洛模拟的IC模型

简介

解决该问题原来在计算上非常繁重。
例如,在一个由1,000个节点组成的相对较小的网络中,存在8万亿个大小为k = 5的种子集的不同可能候选对象,即使在最新的高性能计算资源下也无法直接求解。因此,在过去的15年中,非常活跃的文献试图找到可以快速解决的问题的近似解决方案。

那么我们先实现这个经典的传播模型,并利用贪心算法进一步求解影响力最大化问题。

引入库函数

%matplotlib inline
import matplotlib.pyplot as plt
from random import uniform, seed
import numpy as np
import pandas as pd
import time
from igraph import *
import random

测试图

这里我用的上面的例子:
在这里插入图片描述
用gephi换了个样子haha~
毕竟是贪心,节点数太多了实在是慢。

蒙特卡洛模拟

在这里插入图片描述
上面一段就是用到模拟的地方,大致就是随机生成了一个数组,然后和我输入的设定p进行比较,如果小于就可以被激活,当然了我这里偷懒了,没有egde的权重。呵呵,也就是没有传播概率,那就是相当于每两个被连接点的p相同。

然后我就可以得到模拟一次的激活情况,但是这样的效果是不稳定的,存在很大的偶然性,所以模拟几次,然后取平均就可以了。

源代码在后面:

贪心求最大影响力

这个算法思路,和我原来的blog其实是一样的,所以不多说了,但是区别还是有的。

这次没有用原始的邻接矩阵进行编程,使用的是igraph,所以还是显得很简洁嘀。
代码地址放在最后。

源代码

传送门

大家共勉~~

  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值