当前位置: 首页 > news >正文

独立级联(Independent Cascade)模型的原理及代码实现

目录

  • 1. 原理
  • 2. 代码实现
    • 2.1 数据集
    • 2.2 独立级联

1. 原理

独立级联模型在影响力最大化任务中属于比较经典的影响力传播模型。

具体来讲,针对某一具体传播的实体(谣言、绯闻、产品等),将图中的每个点描述为两种可能状态:不活跃(inactive)和活跃(active)。不活跃状态表示该个体还没有接受对应实体,而活跃状态表示该个体已经接受对应的实体。节点从不活跃状态变为活跃状态表示该节点接受了对应实体,也称之为被激活。

在社交网络间,如果存在边e=(u,v),我们可以说节点u对节点v存在影响力,反之不一定。给定一个初始的激活节点集合(也称为种子节点集合),集合中的节点将以一定概率去激活(影响)它们未被激活的邻居节点,被激活的邻居节点又继续去激活剩下的未被激活的邻居节点,如此往复,直至没有节点可激活。需要注意的是,每个被激活的节点只有一次机会去激活其未被激活的邻居节点,如果未激活就不再尝试

独立级联模型的关键在于“独立”,对于一个未被激活的节点v来讲,在t时刻其邻居节点中可能存在多个在t-1时刻被激活的邻居节点,这些邻居节点都会尝试激活节点v,而这些激活动作间是相互独立的。

假设在t时刻节点vn个在t-1时刻被激活的邻居节点 a 1 , a 2 , . . . , a n a_1, a_2,...,a_n a1,a2,...,an,这些节点激活节点v的概率分别为 p a 1 , v , p a 2 , v , . . . , p a n , v p_{a_1,v},p_{a_2,v},...,p_{a_n,v} pa1,v,pa2,v,...,pan,v,那么节点 v v v被激活的概率为:
1 − ( 1 − p a 1 , v ) ( 1 − p a 2 , v ) . . . ( 1 − p a n , v ) 1-(1-p_{a_1,v})(1-p_{a_2,v})...(1-p_{a_n,v}) 1(1pa1,v)(1pa2,v)...(1pan,v)

具体来讲,只要有一个节点将节点v激活那么节点v就被激活。

那么算法步骤可以被分解为:

  1. 初始化种子节点,然后激活种子节点作为初始激活集合。
  2. 寻找尚未被激活且有激活节点作为邻居节点的节点,放入备选节点集合。
  3. 将激活集合情清空。依次对备选节点集合中的节点计算激活概率,然后尝试激活,激活过程具体来讲为:随机初始化一个概率值,如果激活概率大于等于该值则进行激活。被激活的节点将被放进激活集合。
  4. 重复23步骤,直至没有可激活的节点。

2. 代码实现

在本次代码实现中,每个节点激活邻居节点的概率都由采样得到,采样分布为01之间的均匀分布。

2.1 数据集

数据集采用PyG中已经处理好的GemsecDeezer数据集,具体来讲为:

data = GemsecDeezer('data', name='RO')
graph = data[0]
G = to_networkx(graph)

GemsecDeezer表示从一个音乐网站Deezer上收集到的用户及其关注者社交网络,一共包含三个欧洲国家的用户:
在这里插入图片描述其中name=RO表示罗马尼亚用户数据集。

2.2 独立级联

首先为每条边(u,v)都初始化一个概率值,表示节点u激活节点v的概率:

# init probability
init_pro = uniform(size=G.number_of_edges())
for idx, e in enumerate(G.edges()):
    G[e[0]][e[1]]['p'] = init_pro[idx]

初始的种子节点设置:

init_seed = [4606]

然后是IC模型的定义:

def ic_model():
    activated = copy.deepcopy(init_seed)
    activated_status = np.zeros(G.number_of_nodes(), dtype=int)
    # initial activate
    for seed in init_seed:
        activated_status[seed] = 1

    while True:
        # 寻找未被激活且与激活节点相连的节点
        candidate_nodes = []
        candidate_nodes_pro = {}
        for v in G.nodes():
            candidate_nodes_pro[v] = []
            for u in activated:
                if G.has_edge(u, v) and activated_status[v] != 1:
                    if v not in candidate_nodes:
                        candidate_nodes.append(v)
                    # 添加概率
                    candidate_nodes_pro[v].append(G[u][v]['p'])

        print(candidate_nodes)
        if len(candidate_nodes) == 0:
            break

        # 计算概率
        probability = []
        for candidate_node in candidate_nodes:
            pro = 1.0
            for p in candidate_nodes_pro[candidate_node]:
                pro = pro * (1 - p)

            probability.append(1 - pro)

        # 尝试激活
        # 下一轮传播过程中的初始激活节点是本轮被激活的节点
        activated = []
        for candidate_node, pro in zip(candidate_nodes, probability):
            s = random.random()
            if pro >= s:
                activated_status[candidate_node] = 1
                activated.append(candidate_node)

    return activated_status

最后返回网络中所有节点的激活状态。

相关文章:

  • python笔记Ⅵ--函数、函数的参数
  • NOA市占率超50%+影子模式,这家中国车企走出一条不寻常道路
  • 项目经理带团队,这6个坑一定要避开
  • 新手小白适合做哪个跨境电商平台?测评自养号能带来哪些收益及优势?
  • 网站SEO规范
  • Linux云服务器:MySQL安装失败、多种错误总结 | 个人解决参考
  • DockerHub 镜像仓库原理
  • Java 同步工具与组合类的线程安全性分析
  • springcloud之feign使用
  • Git的基本使用(用户初始化配置、新建代码库、把文件提交到缓存区、把文件提交到本地仓库等)
  • node切换后没有npm功能
  • uniapp AES加密解密
  • 第二届邯郸钢铁展会,图扑软件荣获“2022钢铁行业智造之星奖”
  • 第三届国际品质节,群硕企业与OI产品共同获奖
  • JSP琴行管理系统myeclipse开发mysql数据库bs框架java编程web网页结构
  • Android组件 - 收藏集 - 掘金
  • Centos6.8 使用rpm安装mysql5.7
  • conda常用的命令
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • in typeof instanceof ===这些运算符有什么作用
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java 多线程编程之:notify 和 wait 用法
  • java2019面试题北京
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • web标准化(下)
  • 程序员该如何有效的找工作?
  • 近期前端发展计划
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 强力优化Rancher k8s中国区的使用体验
  • 区块链将重新定义世界
  • 如何使用 JavaScript 解析 URL
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 云大使推广中的常见热门问题
  • 运行时添加log4j2的appender
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​MySQL主从复制一致性检测
  • !!java web学习笔记(一到五)
  • #宝哥教你#查看jquery绑定的事件函数
  • $$$$GB2312-80区位编码表$$$$
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)Unity3DUnity3D在android下调试
  • ./configure、make、make install 命令
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net 无限分类
  • .NET 中 GetProcess 相关方法的性能
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • @Bean注解详解