关键节点组挖掘(附Python实现)

一、实验内容简介

该实验主要利用基于度的排序基于投票策略的排序分别挖掘出一组重要节点作为种子节点,然后在给定的网络中传播,一直到稳态,然后统计感染的规模NR。最后通过比较两种方法的感染规模给出相应的评价,给出不同感染率和不同种子节点条件下的实验结果。

二、算法说明

  1. 首先是数据结构的选取,根据数据是稀疏图和有向图的特点,这里选择十字链表来存储。

  2. 然后是两种排序策略。第一种是基于度的排序,思想很简单,就是根据度的大小来对节点进行排序,选取前n个节点作为种子节点。第二种是基于投票策略的排序。比上一个要复杂一点,每一个节点有投票能力和投票分数。每次选出得票数最高的节点,当选出一个节点后,该节点的投票能力和投票分数变为0,其相邻节点的投票能力和投票分数会相应地下降。这样的话选取的节点就会相对分散,避免度数高的节点扎堆的情况。

为什么需要排序?因为每个节点的重要程度不一样。直觉是位于中心的节点比位于位于边缘的节点更重要,~~直接比就完事!~~我们当然不能仅凭直觉,需要相应的算法证明这一点。

image-20240407175432019

  1. 最后就是应用著名的信息传播模型–SIR模型,在给定初始种子节点和感染率的情况下(康复率默认为1),统计最后的感染规模。

三、算法分析与设计

学习完算法的基本原理后,现在开始真正实现该算法。首先需要建图。要建图就要先找数据,我这里直接直接从网上找了现成的数据(bing搜索“重要节点组挖掘”的第一个搜索结果),有四个文件,正好拿来对比结果。每个数据第一行都是两个数字,点的数量和边的数量。读取后按点的数量建图,依次建立十字链表。

class Node:# 节点的关键代码def __init__(self, value):self.value = valueself.parents = []self.children = []

图建好后,就具体实现两种排序。按度排序很简单,值得一提的是,因为是有向图,又要代表传播能力,这里统一使用出度来代表度。Python代码很简单:

temp=sorted(self.graph1,key=lambda l: l.chudu, reverse=True)[:self.num]

接着实现基于投票策略的排序。其实投票策略有很多种,这里选取比较简单的一种,即投票能力按比例降低,降低比例为60%,并且是二阶降低。代码实现略微复杂一些:

temp = []for i in range(self.num):a = max(self.graph2, key=lambda l: l.score)temp.append(a)for j in a.children:for k in self.graph2[j].parents:self.graph2[k].score -= self.graph2[j].ability * 0.6self.graph2[j].score -= a.abilityself.graph2[j].ability *= 0.4a.ability = 0a.score = 0

最后实现SIR模型。核心实现过程就是构建一个队列,先让种子节点进入这个队列。然后队列每出来一个节点,就遍历这个节点的子孙节点,以感染率作为概率把感染的节点加入队列。不断重复,直到队列为空。把康复者的数量作为总的数量来作为感染规模。下面是队列核心的操作:

while sir_list[1]:for i in queue[0].children:if graph[i].sir == 0 and np.random.binomial(1, self.alpha, 1)[0]:graph[i].sir = 1sir_list[0] -= 1sir_list[1] += 1queue.append(graph[i])queue.pop(0)sir_list[1] -= 1sir_list[2] += 1lunshu += 1

四、测试结果

在写完代码后,就可以开始测试了。主要的参数就是感染率和种子节点数量,感染率在0到1之间,种子节点数量在1到120之间。

在测试之前首先感谢数据来源:RankVote_重要节点组挖掘 - xxxl’s Blog (4ever-xxxl.github.io)

然后开始测试。首先固定种子节点数量在100不变,感染率依次从低到高,分别给出相应的结果。

imgimg

imgimg

imgimg

可以看到,两种策略的感染规模和感染轮数都随着感染率的上升而上升,并且在初始种子节点数量相同时,基于投票策略一般都要比按度排序策略的感染规模要大一些。

然后固定感染率0.5不变,改变种子节点数量再来测试。

imgimg

imgimg

imgimg

可以看到,随着种子节点数量的增长,感染规模也在不断上升。同时也可以看到,在大多数情况下,基于投票策略一般比按度排序策略的感染规模大。这里有一个例外,就是第一个文件的图,两种策略的结果相差不大,具体原因下面开始分析。

五、分析与探讨

测试完毕后,开始分析产生这种测试结果的原因。感染率不变,初始种子节点越多,感染规模越大;初始种子节点数量不变,感染率越大,感染规模越大。这是符合经验和常识的,应该不需要过多解释。接下来简单解释在感染率和初始种子节点相同的情况下,按度排序策略与基于投票策略最终的感染规模的差异。大体来说,基于投票策略最终的感染规模会更大一些,因为投票策略削弱了度数比较高的聚集在一起的节点群的优势,使节点更加分散,因此效果更好。但第一个文件中是个例外,大概原因是本来度数较高的节点在原来图的节点就比较分散,这时投票策略就没有太大的优势了。但因为这种是偶然的,是特殊情形。总的来说,基于投票的策略更优一些,效果更好一些。

最后,基于投票策略的算法还可以继续改进,不同的投票策略所导致的最后的感染规模差异也比较大。高效算法如机器学习里面的投票方法等,是以后改进的方向。另外,除了这两种方法以外,还有其他的选取种子节点的更高效方法,如通过计算该节点到其他各个节点的最短路径的长度之和的倒数作为排序依据等,值得未来学习和应用。

附录:源代码

"""
对给定的网络,采用十字链表建立网络
采用度选择策略和基于投票的策略选出一组重要节点的算法设计及实现
试验对比,分析不同初始种子节点数量情况下,两种方法的感染规模对比;不同感染率alpha情况下,两种方法的对比
"""
import copy
import re
import numpy as np# 图的节点
class Node:def __init__(self, value):self.value = valueself.parents = []self.children = []self.chudu = 0self.score = 0self.ability = 1self.sir = 0  # 0表示易感者,1表示感染者,2表示恢复并免疫者def __str__(self):return str(self.chudu) + ',' + str(self.ability)# 算法实现
class SIR:def __init__(self, graph, alpha, num):"""传进来已经构建好的图"""self.graph = graphself.num = numself.graph1 = [copy.deepcopy(i) for i in graph]self.graph2 = [copy.deepcopy(i) for i in graph]self.graph1_sir = [len(graph) - num, num, 0]self.graph2_sir = [len(graph) - num, num, 0]self.alpha = alpha  # 感染率self.beta = 1  # 康复率def sortByDegree(self):"""按度(出度)排序"""temp = sorted(self.graph1, key=lambda l: l.chudu, reverse=True)[:self.num]for i in temp:i.sir = 1def sortByVote(self):"""基于投票策略的排序"""temp = []for i in range(self.num):a = max(self.graph2, key=lambda l: l.score)temp.append(a)for j in a.children:for k in self.graph2[j].parents:self.graph2[k].score -= self.graph2[j].ability * 0.6self.graph2[j].score -= a.abilityself.graph2[j].ability *= 0.4a.ability = 0a.score = 0for i in temp:i.sir = 1def sir(self):"""分别使用两种排序挖掘关键节点组,利用sir模型对比两种方法的差异:return:"""self.sortByDegree()self.sortByVote()lunshu1, guimo1 = self.test(self.graph1, self.graph1_sir)lunshu2, guimo2 = self.test(self.graph2, self.graph2_sir)print(f"按度排序策略一共感染了{lunshu1}轮,感染率为{guimo1}")print(f"基于投票策略一共感染了{lunshu2}轮,感染率为{guimo2}")def test(self, graph, sir_list):"""计算感染率和感染轮数:param graph: 图:param sir_list: sir参数:return: 感染率和感染轮数"""lunshu = 0  # 轮数queue = []for i in graph:if i.sir == 1:queue.append(i)while sir_list[1]:for i in queue[0].children:if graph[i].sir == 0 and np.random.binomial(1, self.alpha, 1)[0]:graph[i].sir = 1sir_list[0] -= 1sir_list[1] += 1queue.append(graph[i])queue.pop(0)sir_list[1] -= 1sir_list[2] += 1lunshu += 1return lunshu, sir_list[2] / len(graph)if __name__ == '__main__':data = ['network.txt', 'router.txt', 'sex.txt', 'USAir.txt']alpha = float(input('请输入感染率:'))num = int(input("请输入初始种子节点数量:"))if alpha > 1 or alpha <= 0:print('感染率输入错误!')elif num <= 0 or num > 120:print("种子数量输入错误!")else:for i in data:f = open(i, encoding='utf-8')d = f.readlines()v, e = map(int, d[0].rstrip('\n').split(' '))print(f"\n这是第{data.index(i) + 1}个文件,文件名为 {i}")# 构建图graph = [Node(k) for k in range(v)]for j in range(1, e + 1):temp = re.split(r"[ |\t]+", d[j].rstrip('\n'))a, b = map(int, temp)graph[a].children.append(b)graph[a].chudu += 1graph[a].score += 1graph[b].parents.append(a)# 算法实现suanfa = SIR(graph, alpha, num)suanfa.sir()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合资红利耗尽,海外喜忧参半:上汽2023有点“遗憾”

作者 |老缅 编辑 |德新 3月29日&#xff0c;上汽集团发布2023年全年财报。 数据显示&#xff0c;2023年上汽集团实现总营收7447.05亿元&#xff0c;同比增加0.09%&#xff1b;归属于上市公司股东的净利润141.06亿元&#xff0c;同比减少12.48%&#xff1b;基本每股收益1.226元…

CSS - 你实现过宽高自适应的正方形吗

难度 难度级别:中高级及以上 提问概率:80% 宽高自适应的需求并不少见,尤其是在当今流行的大屏系统开发中更是随处可见,很显然已经超越了我们日常将div写死100px这样的范畴,那么如何实现一个宽高自适应的正方形呢?这里提出两种实现方案。…

景区云旅游/视频慢直播方案设计与平台搭建

一、行业背景 经文化和旅游部数据中心测算&#xff0c;今年清明节假期3天全国国内旅游出游1.19亿人次&#xff0c;按可比口径较2019年同期增长11.5%&#xff1b;国内游客出游花费539.5亿元&#xff0c;较2019年同期增长12.7%。踏青赏花和户外徒步成为假期的热门出游主题。随着…

VSCode SSH 连接 Could not establish connection to “XXX“: spawn UNKNOWN.

1. 确认问题&#xff1a; 拉取vscode终端&#xff1a;快捷键 ctrl(数字1旁边那个) 输入&#xff1a;ssh -V 2. 解决方法 2.1 找到本地SSH 位置 默认本地路径&#xff1a; C:\Windows\System32\OpenSSH 2.2 找到要修改的位置 进入 ssh 插件的设置&#xff08;可以通过在插…

VIM支持C/C++/Verilog/SystemVerilog配置并支持Win/Linux环境的配置

作为一个芯片公司打杂人口&#xff0c;往往需要一个皮实耐打上天入地的编辑器… 一、先附上github路径&#xff0c;方便取走 git clone gitgithub.com:qqqw4549/vim_config_c_verilog.git 二、效果展示 支持ctrl]函数/模块跳转&#xff0c;支持cscope字串全局代码搜索 依赖&am…

The C programming language (second edition,KR) exercise(CHAPTER 2)

E x c e r c i s e 2 − 1 Excercise\quad 2-1 Excercise2−1&#xff1a;输出结果如图1和图2所示&#xff0c;这道练习题需要文章1和文章2的知识。 #include <stdio.h> #include <limits.h>float getFloat(char sign, unsigned char exp, unsigned mantissa); do…

数字人直播系统是什么?AI数字人直播间搭建方法来了!

无人直播的时代&#xff0c;短视频和直播平台正在风口&#xff0c;各条赛道内也早已人满为患&#xff0c;很多线下商家都想参与其中&#xff0c;因为时间、地方、设备等限制久久不能去实行起来。所以&#xff0c;数字人直播新模式成为了线下商家的救星&#xff0c;线下商家方法…

go语言实现无头单向链表

什么是无头单向链表 无头单向链表是一种线性数据结构&#xff0c;它的每个元素都是一个节点&#xff0c;每个节点都有一个指向下一个节点的指针。"无头"意味着这个链表没有一个特殊的头节点&#xff0c;链表的第一个节点就是链表的头。 优点&#xff1a; 动态大小&…

企业如何做好数字化?

企业进行数字化转型是一个复杂且系统性的过程&#xff0c;涉及战略规划、技术应用、组织变革、文化建设等多个方面。以下步骤和建议可以帮助企业做好数字化转型&#xff1a; 1、明确转型愿景和目标&#xff1a;确定企业的数字化愿景&#xff0c;明确转型的长期目标和短期里程碑…

烤羊肉串引来的思考--命令模式

1.1 吃羊肉串&#xff01; 烧烤摊旁边等着拿肉串的人七嘴八舌地叫开了。场面有些混乱&#xff0c;由于人实在太多&#xff0c;烤羊肉串的老板已经分不清谁是谁&#xff0c;造成分发错误&#xff0c;收钱错误&#xff0c;烤肉质量不过关等。 外面打游击烤羊肉串和这种开门店做烤…

基于Springboot4S店车辆管理系统

采用技术 基于Springboot4S店车辆管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员功能 首页 销售员管理 维修员管理 客户管理 供应…

Altair®(澳汰尔)Inspire™ Extrude Metal 专为进行高效金属挤压设计

所有挤压公司都希望消除成本高昂的原型设计&#xff0c;缩短重新设计周期。现在&#xff0c;各种规模的企业组织均可获得高等物理特性仿真技术。Inspire Extrude Metal 易于掌握&#xff0c;让所有工程师或设计师都能通过仿真&#xff0c;更好地了解任何特定金属合金的型材特性…

【问题处理】银河麒麟操作系统实例分享,银河麒麟高级服务器操作系统mellanox 网卡驱动编译

1.Mellanox 网卡源码驱动下载链接&#xff1a; https://www.mellanox.com/downloads/ofed/MLNX_EN-5.7-1.0.2.0/MLNX_EN_SRC-5.7-1.0.2.0.tgz 2.系统及内核版本如下截图&#xff1a; 3.未升级前 mellanox 网卡驱动版本如下&#xff1a; 4.解压 “MLNX_EN_SRC-5.7-1.0.2.0.tg…

JavaWeb后端——Mybatis

概述 Mybatis&#xff1a;Java程序来对数据库进行操作&#xff0c;一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 SSM&#xff1a;SpringMVC、Spring、Mybatis 快速入门 步骤2&#xff1a;注意数据库连接的四要素 application.properties&#xff1a;springboot 的默…

【leetcode】动态规划::前缀和

标题&#xff1a;【leetcode】前缀和 水墨不写bug 正文开始&#xff1a; &#xff08;一&#xff09;简单前缀和 描述 给定一个长度为n的数组a1​,a2​,....an​. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询问, 请输出al​al1​....ar​ 输入描述&#xff1a; 第一…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑灵活爬坡产品的虚拟电厂两阶段分布鲁棒优化运营策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

轨迹规划 | 图解最优控制LQR算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 最优控制理论2 线性二次型问题3 LQR的价值迭代推导4 基于差速模型的LQR控制5 仿真实现5.1 ROS C实现5.2 Python实现5.3 Matlab实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全…

硬件标准化之道:Linux社区与硬件厂商的协同创新

在Linux的广阔世界中&#x1f30c;&#xff0c;与各式各样的硬件设备进行互动和协作是一项不断进行的挑战&#x1f527;。硬件厂商和Linux社区的紧密合作&#xff0c;通过制定一系列标准和协议&#x1f4dc;&#xff0c;使得从键盘&#x1f3b9;和鼠标&#x1f5b1;到复杂的网络…

七、Ajax(Django开发)

Ajax&#xff08;Django开发&#xff09; 知识点的回顾&#xff1a;1.Ajax请求2.订单小结3.图表4.关于文件上传4.1基本操作案例&#xff1a;批量上传数据案例&#xff1a;混合数据&#xff08;Form&#xff09;4.2启用media案例&#xff1a;混合数据&#xff08;form&#xff0…