一、简介

degreediscount算法即度折扣算法,是一个基于节点度的启发式算法

度折扣算法的基本思想是:假设节点j是节点i的邻居,如果j已被选为种子节点,那么在基于度中心性指标考虑节点i是否作为种子节点时,应该对连边(i,j)打折扣,因为i对j不能产生额外的影响。假设所有边的激活概率都相同,均为β。当节点i的邻居中有si个激活种子时,被激活的概率为1-(1-β)的si的次方,此时i节点能被邻居节点激活,其期望影响力与直接将i节点选为种子节点的期望影响力相同,即此时选择节点i作为种子节点不增加额外的影响力 (对期望影响力的贡献为 0)。由于节点 i没有被激活的概率为(1-β)的si的次方,当节点i被选为种子时,其能激活的节点数为1+(di+si)β,其中“1” 表示节点 被激活,“ (di+si)β”表示被激活的邻居数。因此考虑节点i选为种子时,其产生的期望影响力为:

当节点i邻居中没有种子节点时,i作为种子节点产生的期望影响力为:。设γ是对邻居中每个种子节点的度折扣,则 ,可以得到,因此,当节点i有si个种子邻居时,它的度折扣值定义为:

度折扣算法的基本步骤为:第一轮中没有种子节点,所有节点的度都没有被折扣,所以直接选择网络中度最大的节点作为第一个种子;接下来每一轮根据上式计算每个未被激活节点的度折扣值,并选择最大的一个节点加入种子集;循环更新计算直到选出k个种子节点加入种子集 。

二、代码

def degreeDiscountIC(G, k, p=.01):''' Finds initial set of nodes to propagate in Independent Cascade model (without priority queue)Input: G -- networkx graph objectk -- number of nodes neededp -- propagation probabilityOutput:S -- chosen k nodesNote: the routine runs twice slower than using PQ. Implemented to verify results'''d = dict()dd = dict()  # degree discountt = dict()  # number of selected neighborsS = []  # selected set of nodesfor u in G:d[u] = sum([G[u][v]['weight'] for v in G[u]])  # each edge adds degree 1# d[u] = len(G[u]) # each neighbor adds degree 1dd[u] = d[u]t[u] = 0for i in range(k):# dd saves tuples, max function of a tuple compares the first value in the  tuple, if it the same then compare the second,# we want to compare only the second, so x being a tuple with x[1] we select the second value of the tupleu, ddv = max(dd.items(), key=lambda x: x[1])
#        u, ddv = max(dd.items(), key=lambda (k,v): v)dd.pop(u)S.append(u)for v in G[u]:if v not in S:t[v] += G[u][v]['weight']  # increase number of selected neighborsdd[v] = d[v] - 2 * t[v] - (d[v] - t[v]) * t[v] * preturn S'''if __name__ == '__main__':import timeimport networkx as nxstart = time.time()from YHSF import ICModelS=[]address = 'E:/新建文件夹/DPSO_demo-master/twitter.txt'def read_raw_data(raw_file_dir):g = nx.MultiDiGraph()for line in open(raw_file_dir):str_list = line.split()n1 = int(str_list[0])n2 = int(str_list[1])weight = float(1)# try:#     weight = float(str_list[2])# except:#     weight = float(1)g.add_weighted_edges_from([(n1, n2, weight)])  # G.add_edges_from([(n1, n2)])# g.add_edges_from([(n1, n2)])# g.add_edges_from([(n1, n2, {'weight': weight})])# g.add_edges_from([(n1, n2, {'weight': weight, 'timestamp': timestamp})])return gdef read_raw_data1(raw_file_dir):g = nx.MultiDiGraph()for line in open(raw_file_dir):str_list = line.split()n1 = int(str_list[0])n2 = int(str_list[1])weight = float(1)# try:#     weight = float(str_list[2])# except:#     weight = float(1)# g.add_weighted_edges_from([(n1, n2, weight)])  # G.add_edges_from([(n1, n2)])g.add_edges_from([(n1, n2)])# g.add_edges_from([(n1, n2, {'weight': weight})])# g.add_edges_from([(n1, n2, {'weight': weight, 'timestamp': timestamp})])return gdef multidir2simpledir(multidir_graph):# 输出所有有向边,包括权重# print("-" * 10)  # print(list(G.edges(data=True)))# for e in multidir_graph.edges.data('weight'):#     print(e)print("raw:", multidir_graph.number_of_nodes(), multidir_graph.number_of_edges(),nx.number_of_selfloops(multidir_graph))c = Counter(multidir_graph.edges())simpledir_graph = nx.DiGraph()for n1, n2, w in multidir_graph.edges.data('weight'):# avoid repeating edges and self-loopsif not simpledir_graph.has_edge(n1, n2) and n1 != n2:simpledir_graph.add_edge(n1, n2, weight=c[n1, n2])if n1 == n2:  # 没有loop的节点属性为None,有loop为loop个数if not simpledir_graph.has_node(n1):  # 新节点要先添加simpledir_graph.add_node(n1, loops=c[n1, n2])else:  # 已有的节点,直接设置属性simpledir_graph.nodes[n1]["loops"] = c[n1, n2]  # 报错原因是n1节点尚未添加到simpledir_graphprint("processed:", simpledir_graph.number_of_nodes(), simpledir_graph.number_of_edges(),nx.number_of_selfloops(simpledir_graph))return simpledir_graph# 根据有向单边图的节点loop数以及边频数,重新计算边影响力def edgeimpact(simpledir_graph):graph = nx.DiGraph()N1insum = dict(simpledir_graph.in_degree(weight='weight'))for v, u, w in simpledir_graph.edges.data('weight'):impactv2u = float(w) / (N1insum[u] + 0)  # simpledir_graph.nodes[u]["loops"]graph.add_edge(v, u, weight=impactv2u)flag = os.path.exists(address)if not flag: file = open(address, 'a')# print("^" * 10)  # 输出归一化边权重for e in graph.edges.data('weight'):if not flag: s = str(e[0]) + " " + str(e[1]) + " " + str(e[2]) + '\n'if not flag: file.write(s)# print(e)if not flag: file.close()print("normalized:", graph.number_of_nodes(), graph.number_of_edges(), nx.number_of_selfloops(graph))# print(graph.get_edge_data(6,1),graph.get_edge_data(1,2))#graph.edges[1,2]['weight'],# print(graph.degree[1],graph.degree)# print(graph[4])#,graph.neighbors(4)return graphsimpledir_graph = multidir2simpledir(read_raw_data(address))# 归一化边权重graph = edgeimpact(simpledir_graph)print(time.time() - start)#for k in range(5, 55, 5):print(S)Q=[]W=[]for k in range(5, 55, 5):start_time = time.time()S = degreeDiscountIC(graph, k, p=.01)#print('A:%.2f MB' % (psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024))activenodes = LTModel.simulate(graph, S, 0.25)Q.append(activenodes)end_time = time.time()runningtime1 = end_time - start_timeW.append(runningtime1)print(Q)print("总时间:", W)

算法缺点:虽然度折扣算法具有快速、高效的特性,但该算法还有许多需要改进的地方,这些不足之处是制约该算法性能进一步提升的关键因素。首先,度折扣算法在计算节点的期望影响力时没有考虑邻居的差异性,而是简单地认为每个未激活的邻居节点对该节点期望影响力的贡献是相同的,导致计算期望影响力的公式不够精确。其次,度折扣算法没有考虑节点之间共同邻居数的影响,不能充分降低传播的冗余性,比如节点 和 之间有许多共同邻居,如果节点已被选择为种子节点,则节点被感染的可能性也很高,因为他们之间有多条可能的传播路径,此时再选择节点作为种子节点会导致传播的冗余效应。

算法介绍和内容引用:[1]夏欣, 马闯, 张海峰. 基于改进的度折扣方法研究社交网络影响力最大化问题[J]. 电子科技大学学报, 2021, 50(3):9.

影响力最大化算法——degreediscount以及python实现代码相关推荐

  1. 各项异性扩散(Anisotropic diffusion)--算法简介(python)代码实现

    各项异性扩散(Anisotropic diffusion)–算法简介(python)代码实现 学习博文 https://blog.csdn.net/qq_38784098/article/detail ...

  2. 影响力最大化算法——MIA算法python复现

    MIA算法原文:Chen W ,  Wang C ,  Wang Y . Scalable Influence Maximization for Prevalent Viral Marketing i ...

  3. 机器学习经典分类算法 —— C4.5算法(附python实现代码)

    目录 理论介绍 什么是分类 分类的步骤 什么是决策树 决策树归纳 信息增益 相关理论基础 计算公式 ID3 C4.5 python实现 参考资料 理论介绍 什么是分类 分类属于机器学习中监督学习的一种 ...

  4. t-SNE算法(附Python/R代码)

    假设你有一个包含数百个特征(变量)的数据集,却对数据所属的领域几乎没有什么了解. 你需要去识别数据中的隐藏模式,探索和分析数据集.不仅如此,你还必须找出数据中是否存在模式--用以判定数据是有用信号还是 ...

  5. 基于多相滤波器的数字信道化算法详解(Python, Verilog代码已开源)

    基于多相滤波器的数字信道化算法详解 推导过程 总结 仿真 本文详细介绍了基于多相滤波器的数字信道化算法的推导过程, 如果您在阅读的过程中发现算法推导过程中有任何错误, 请不吝指出. 此外, 进入我的G ...

  6. 会议笔记_一种带时间约束的影响力最大化算法

    引入时间因素 节点或者人在不同时间影响其他节点的属性不同 两个创新点: 最早激活时间:超过时间约束不会被激活 累计传播延时:激活一个节点需要多少时间 种子选择方法(三步): 第一步·设计包含时间约束的 ...

  7. 【转】如何从计算视角研究网络传播影响力最大化问题?

    电商中对社交网络的两个应用方向,基于社交网络做推荐和基于社交网络做裂变广告.有意思的是做电商的往往做不起社交,电商和社交数据很难打通,而不管做推荐还是做广告,所有的建模和分析都是基于用户行为数据的,不 ...

  8. 社交网络中基于位置的影响力最大化 CIKM2015 译文

    社交网络中基于位置的影响力最大化 摘要 这篇文章的目的是通过研究在LBSN平台中基于位置的影响最大化来实现O2O模式上的产品推广.随着O2O环境下存在的消费行为,传统的线上影响力扩散模型不能准确描述产 ...

  9. 广度优先搜索、宽度优先搜索,《学点算法吧,Python》

    一.广度优先搜索 广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型. 广度优先搜索是一种用于图的查找方法,可以帮助解决两个问题: 从节点A出发,有前 ...

  10. Information Sciences 2022 | 利用图嵌入和图神经网络实现社交网络中的影响力最大化

    目录 前言 1. 影响力最大化 2. SGNN 2.1 标签生成 2.2 struc2vec 2.3 GNN特征处理 2.4 回归预测 2.5 整体框架 3. 实验 3.1 数据集 3.2 评价指标 ...

最新文章

  1. Linux那些事儿 之 戏说USB(34)接口的驱动
  2. kotlin中的异常处理_如何使用assertFailsWith在Kotlin中测试异常
  3. 升级BIOS解决DELL R730XD虚拟机死机问题
  4. Safari、IE浏览器出现允许改写地址栏的漏洞
  5. html漂浮广告随页面移动代码,JS漂浮广告代码,慢慢漂移的广告JS代码
  6. protobuf java_ProtoBuf for java使用笔记 | 学步园
  7. 采用开源方案的优势--从搭建WebGIS系统说起
  8. python转换函数使用_python进制转换函数代码的使用
  9. 前端学习(2445):分页的实现
  10. php 到精通 书,PHP从入门到精通——读书笔记(第20章:Zend Framwork框架)
  11. matlab使用parpool加速蒙特卡洛仿真
  12. 2022届网易校招提前批笔试直播笔记
  13. CF - 158B - Taxi
  14. 全电动梅赛德斯EQS年底将在曼谷生产下线;麦格纳突破车尾照明技术2023年可投入生产 | 美通企业日报...
  15. GUI编程入门到游戏实战
  16. HTML怎么设置自动滚动的图片,转:HTML中让图片滚动的marquee标签的使用方法
  17. dva自定义组件及使用方法
  18. 2022保密教育线上培训考试 05
  19. innodb buffer pool管理--数据页的访问
  20. 终焉誓约怎么用电脑玩 终焉誓约模拟器玩法教程

热门文章

  1. 索尼电视android9,索尼电视系统更新通知:解决升级到安卓9.0版本后bug问题
  2. Android 分贝测试仪功能,华为移动终端开发
  3. 远程升级单片机程序设计思路
  4. python 水位流量关系曲线_水位流量关系曲线的绘制方法_张红艳
  5. 2021年中国房地产行业发展现状及2022年前景展望「图」
  6. 中维高清监控录像被覆盖故障排除
  7. dell主板恢复出厂设置_DELL戴尔电脑BIOS怎么恢復初始状态
  8. rnn--重新温习实现MNIST手写体识别
  9. 为什么计算机屏幕出现黄色,电脑屏幕发黄的五种原因及处理方法
  10. java 服务器调优_Java远程服务器调优