目录

1、环境配置

2、LT传播模型算法实现

3、贪心算法实现

4、LT模型改进算法实现


社交网络影响力最大化——贪心算法实现(Python实现)

1、环境配置

环境: Win7 Pycharm Anaconda2

该算法每个节点的阈值设为 0.5

2、LT传播模型算法实现

linear_threshold_clime.py(LT传播模型算法)

# -*- coding: utf-8 -*-
"""
Implement linear threshold models"""
import copy
import itertools
import random
import math
import networkx as nx__all__ = ['linear_threshold']#-------------------------------------------------------------------------
#  Some Famous Diffusion Models
#-------------------------------------------------------------------------def linear_threshold(G, seeds, steps=0):"""Parameters----------G : networkx graphThe number of nodes.seeds: list of nodesThe seed nodes of the graphsteps: intThe number of steps to diffuseWhen steps <= 0, the model diffuses until no more nodescan be activatedReturn------layer_i_nodes : list of list of activated nodeslayer_i_nodes[0]: the seedslayer_i_nodes[k]: the nodes activated at the kth diffusion stepNotes-----1. Each node is supposed to have an attribute "threshold".  If not, thedefault value is given (0.5).2. Each edge is supposed to have an attribute "influence".  If not, thedefault value is given (out_deg / out_deg_sum)"""if type(G) == nx.MultiGraph or type(G) == nx.MultiDiGraph:raise Exception( \"linear_threshold() is not defined for graphs with multiedges.")# make sure the seeds are in the graphfor s in seeds:if s not in G.nodes():raise Exception("seed", s, "is not in graph")# change to directed graphif not G.is_directed():#DG = G.to_directed()DG=nx.DiGraph(G)else:DG = copy.deepcopy(G)# init thresholdsfor n in DG.nodes():if 'threshold' not in DG.node[n]:DG.node[n]['threshold'] = 0.5elif DG.node[n]['threshold'] > 1:raise Exception("node threshold:", DG.node[n]['threshold'], \"cannot be larger than 1")# init influences# in_deg_all = DG.in_degree()        #获取所有节点的入度out_deg_all=DG.out_degree()        #获取所有节点的出度in_edges_all=DG.in_edges()         #获取所有的入边for e in DG.edges():               #对所有的边进行循环if 'influence' not in DG[e[0]][e[1]]:out_deg=out_deg_all[e[0]]      #获取节点e[0]的出度in_edges=in_edges_all._adjdict[e[1]]    #获取节点e[1]的所有的入边edges_dict=dict(in_edges)in_all_edges=list(edges_dict.keys())      #获取节点e[1]的所有入边节点并存入列表out_deg_sum=0for i in in_all_edges:                #求节点e[1]所有入边节点的出度和out_deg_sum=out_deg_sum+out_deg_all[i]DG[e[0]][e[1]]['influence'] = out_deg / out_deg_sumelif DG[e[0]][e[1]]['influence'] > 1:raise Exception("edge influence:", DG[e[0]][e[1]]['influence'], \"cannot be larger than 1")# perform diffusionA = copy.deepcopy(seeds)if steps <= 0:# perform diffusion until no more nodes can be activatedreturn _diffuse_all(DG, A)# perform diffusion for at most "steps" rounds onlyreturn _diffuse_k_rounds(DG, A, steps)def _diffuse_all(G, A):layer_i_nodes = [ ]layer_i_nodes.append([i for i in A])while True:len_old = len(A)A, activated_nodes_of_this_round = _diffuse_one_round(G, A)layer_i_nodes.append(activated_nodes_of_this_round)if len(A) == len_old:breakreturn layer_i_nodesdef _diffuse_k_rounds(G, A, steps):layer_i_nodes = [ ]layer_i_nodes.append([i for i in A])while steps > 0 and len(A) < len(G):len_old = len(A)A, activated_nodes_of_this_round = _diffuse_one_round(G, A)layer_i_nodes.append(activated_nodes_of_this_round)if len(A) == len_old:breaksteps -= 1return layer_i_nodesdef _diffuse_one_round(G, A):activated_nodes_of_this_round = set()for s in A:nbs = G.successors(s)for nb in nbs:if nb in A:continueactive_nb = list(set(G.predecessors(nb)).intersection(set(A)))if _influence_sum(G, active_nb, nb) >= G.node[nb]['threshold']:activated_nodes_of_this_round.add(nb)A.extend(list(activated_nodes_of_this_round))return A, list(activated_nodes_of_this_round)def _influence_sum(G, froms, to):influence_sum = 0.0for f in froms:influence_sum += G[f][to]['influence']return influence_sum

3、贪心算法实现

test_linear_threshold_clime.py

#!/usr/bin/env python
# coding=UTF-8
from nose.tools import *
from networkx import *
from linear_threshold_clime import *
"""Test Diffusion Models
----------------------------
"""
#贪心算法
def _linear_clime(G,k):      #参数k-表示要获取的子节点的个数allnodes = G.nodes()     #获取图中所有节点数seed_nodes = []          #该列表存储选取的子节点集for m in range(k):all_nodes = list(allnodes)   #将所有的节点存储在all_nodes列表里layers_activite = []    # 存储每个节点的激活节点列表lengths = []         # 存储每个节点的激活列表长度datas = []for i in all_nodes:   #遍历所有的节点,分别求出每个节点对应的激活节点集以及激活节点集的长度data = []data.append(i)datas.append(i)data_test=seed_nodes+datalayers = linear_threshold(G,data_test)data.pop()del layers[-1]length = 0layer_data = []for j in range(len(layers)):length = length + len(layers[j])layer_data = layer_data + layers[j]length_s = length - len(layers[0])for s in range(len(layers[0])):del layer_data[0]layers_activite.append(layer_data)lengths.append(length_s)# length_max = max(lengths)  # 获取激活节点最多的节点数layers_max = layers_activite[lengths.index(max(lengths))]  # 获取被激活节点数最多的列表seed_nodes.append(datas[lengths.index(max(lengths))])      # 获取被激活节点最多的子节点for i in all_nodes:       #该循环是删除所有节点中seed_nodes节点集if i in seed_nodes:del all_nodes[all_nodes.index(i)]allnodes=all_nodesreturn seed_nodes,layers_max     #返回值是贪心算法求得的子节点集和该子节点集激活的最大节点集#测试算法
if __name__=='__main__':datasets=[]f=open("Wiki-Vote.txt")data=f.read()rows=data.split('\n')for row in rows:split_row=row.split('\t')name=(int(split_row[0]),int(split_row[1]))datasets.append(name)G=networkx.DiGraph()G.add_edges_from(datasets)   #根据数据集创建有向图n=input('Please input the number of seeds: k=')k=int(n)seed_nodes, layers_max=_linear_clime(G,k)   #调用贪心算法获取节点子集和节点子集的最大激活节点集print(seed_nodes)print(layers_max)

运行结果

4、LT模型改进算法实现

LT_improve.py(LT模型改进算法)

#!/usr/bin/env python
# coding=UTF-8
from nose.tools import *
from networkx import *
from linear_threshold_clime import *
from linear_threshold  import *
import math#计算图中边的权重
def Buv_calculate(G,u,v):out_deg_all = G.out_degree()  # 获取所有节点的出度in_edges_all = G.in_edges()  # 获取所有的入边out_deg = out_deg_all[u]  # 获取节点e[0]的出度in_edges = in_edges_all._adjdict[v]  # 获取节点e[1]的所有的入边edges_dict = dict(in_edges)in_all_edges = list(edges_dict.keys())  # 获取节点e[1]的所有入边节点并存入列表out_deg_sum = 0for i in in_all_edges:  # 求节点e[1]所有入边节点的出度和out_deg_sum = out_deg_sum + out_deg_all[i]return out_deg / out_deg_sum#计算每个节点AP的值
def AP_calculate(node):data = []data.append(node)layer_two_nodes = linear_threshold(G, data, 2)  # 获取每个节点的两层出度节点数data.pop()del layer_two_nodes[-1]length = 0for i in range(len(layer_two_nodes)):length = length + len(layer_two_nodes[i])lengths = length - len(layer_two_nodes[0])out_edges = out_edges_all._adjdict[node]  # 获得节点的出边edges_dict = dict(out_edges)out_all_edges = list(edges_dict.keys())  # 将节点的所有出边存入列表Buv_sum = 0for out_edge in out_all_edges:   # 计算该节点所有出边的Buv的值Buv = Buv_calculate(G, node, out_edge)Buv_sum = Buv_sum + Buvcha_sum = 1 + math.e ** (-Buv_sum)AP = lengths + cha_sumreturn APdef select_layers(G,node_list_sorted,k1):   #选择前k/2个节点的算法实现seed_nodes = []  # 存贮种子节点for i in range(k1):data = []data.append(node_list_sorted[0][0])seed_nodes.append(node_list_sorted[0][0])layers = linear_threshold(G, data)        # 使用LT算法data.pop()del layers[-1]layers_activate = []for i in layers:  # 将种子节点和激活的节点存入layers_activate列表for j in i:layers_activate.append(j)for m in node_list_sorted:  # 删除node_list_sorted中的layers_activatefor n in layers_activate:if m[0] == n:node_list_sorted.remove(m)return seed_nodes,node_list_sorteddef _select_others(seed_nodes, other_nodes,k2):     #贪心算法选择剩余k/2个节点for m in range(k2):all_nodes = list(other_nodes)   #将所有的节点存储在all_nodes列表里layers_activite = []    # 存储每个节点的激活节点列表lengths = []         # 存储每个节点的激活列表长度datas = []for i in all_nodes:   #遍历所有的节点,分别求出每个节点对应的激活节点集以及激活节点集的长度data = []data.append(i)datas.append(i)data_test=seed_nodes+datalayers = linear_threshold(G,data_test)data.pop()del layers[-1]length = 0layer_data = []for j in range(len(layers)):length = length + len(layers[j])layer_data = layer_data + layers[j]length_s = length - len(layers[0])for s in range(len(layers[0])):del layer_data[0]layers_activite.append(layer_data)lengths.append(length_s)layers_max = layers_activite[lengths.index(max(lengths))]  # 获取被激活节点数最多的列表seed_nodes.append(datas[lengths.index(max(lengths))])      # 获取被激活节点最多的子节点for i in all_nodes:       #该循环是删除所有节点中seed_nodes节点集if i in seed_nodes:del all_nodes[all_nodes.index(i)]other_nodes=all_nodesreturn seed_nodes,layers_max     #返回值是贪心算法求得的子节点集和该子节点集激活的最大节点集if __name__=='__main__':datasets=[]f=open("Wiki-Vote.txt")data=f.read()rows=data.split('\n')for row in rows:split_row=row.split('\t')name=(int(split_row[0]),int(split_row[1]))datasets.append(name)G=networkx.DiGraph()G.add_edges_from(datasets)   #根据数据集创建有向图allnodes=G.nodes()           #获取图中所有的节点all_nodes=list(allnodes)out_edges_all = G.out_edges() # 获取所有节点的出边node_dict={}               #将节点和节点对应的AP值存入字典for node in all_nodes:        #遍历所有节点获得每个节点的AP值AP=AP_calculate(node)node_dict[node]=APnode_list_sorted=sorted(node_dict.items(),key=lambda d:d[1],reverse=True)  #对字典按AP值进行由大到小排序'''f=open('data.txt','r')data=f.read()node_list_sorted=list(data)'''k=input('Please input inter of k=')seed_nodes, node_list_sorted=select_layers(G,node_list_sorted,k/2)other_nodes=[]'''for i in range(len(node_list_sorted)):other_nodes.append(node_list_sorted[i][0])'''for i in seed_nodes:if i in all_nodes:all_nodes.remove(i)other_nodes=all_nodesseed_nodes, layers_max=_select_others(seed_nodes,other_nodes,k/2)layer=linear_threshold(G,seed_nodes)lenth=len(layers_max)print(seed_nodes)print(layers_max)print(lenth)print(layer)

运行结果:

社交网络影响力最大化(Python实现)及Wiki-Vote数据集资源下载:

社交网络影响力最大化(Python实现)及Wiki-Vote数据集-机器学习文档类资源-CSDN下载

本人博文社交网络影响力最大化项目实战基础学习

1、社交网络影响力最大化(独立级联(IC)模型和线性阈值(LT)模型)介绍

2、社交网络影响力最大化—线性阈值模型(LT模型)算法实现(Python实现)

3、社交网络影响力最大化—贪心算法实现(Python实现)

4、社交网络影响力最大化项目实战源代码和Wiki-Vote数据集下载

交流学习资料共享欢迎入群:955817470(群一),801295159(群二)​​

社交网络影响力最大化——贪心算法实现(Python实现)相关推荐

  1. 一种有效的基于路径的社交网络影响力最大化方法【论文阅读】

    文章目录 一.论文的亮点 二.HIPA算法具体过程 三.论文的优缺点 四.自己的收获点 五.未来可能的突破点 [摘要]本文是关于影响力最大化相关内容:内容的是关于论文An efficient path ...

  2. 贪心算法的python实现

    贪心算法 贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略 ...

  3. LeetCode移掉k位数字(贪心算法)python

    描述 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. num的长度小于10002,且将≥k.给定的num不包含任何前导零. 您在真实的面试中是否遇到过这个题? ...

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

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

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

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

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

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

  7. 八十二、Python | Leetcode贪心算法系列

    @Author:Runsen @Date:2020/7/5 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  8. 数组索引必须为正整数或逻辑值是什么意思_贪心算法:K次取反后最大化的数组和...

    ❝ 很多录友都反馈昨天的题目:贪心算法:跳跃游戏II 很难,这样我就放心了,哈哈,因为我刚刚讲解贪心的时候一些录友会建议我:贪心没有必要单独讲,直接讲动规就可以了.应该不少同学都会感觉就贪心嘛,有啥难 ...

  9. 贪心算法求解TSP问题(python)

    这里使用贪心算法求解TSP问题的python版本 # dist 为距离矩阵,start_index 为起始位置 def tsp_quick(dist: list, start_index: int): ...

  10. python leetcode_八十二、Python | Leetcode贪心算法系列

    @Author:Runsen @Date:2020/7/5 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

最新文章

  1. 1小时学会:最简单的iOS直播推流(番外)运行不起AWLive的demo的同学请看这里
  2. VBA word 文件类型html,vba设置word文档的格式
  3. python基础练习(五)
  4. TypeError系列之:TypeError: 'tuple' object is not callable.
  5. gblfy_IDEA常用快捷键技巧
  6. 在Extjs中对日期的处理,以及在后端数据在SQL语句的判断处理
  7. iphone clearColor 不起作用问题
  8. 《编程珠玑》---笔记。浏览此文,一窥此书。
  9. 新媒体营销渠道大盘点
  10. Nginx 限流的天坑
  11. DDD落地过程中有关DTO的思考
  12. 一个功能超全的「登录认证」神器!
  13. 【uniapp小程序】request发起请求
  14. 2018-11-5-win10-uwp-异步转同步
  15. 小白也能学会的调色教程,你学会了吗?
  16. 大学计算机基础教学大纲,大学计算机基础教学大纲
  17. java源程序编译型_Java语言的源程序不是编译型的,而是编译解释型的。( )_学小易找答案...
  18. 2020 豆瓣API使用(代理方法) 解决无key方法 code 104解决方法
  19. 关于碧螺春的江湖之三 【苏州 碧螺春 营养成分 健康价值】
  20. iisxpi386 - 迅载网盘

热门文章

  1. html链接鼠标在悬停颜色,如何让HTML链接显示悬停样式?
  2. 【树莓派】USB摄像头+python+opencv
  3. 树莓派使用usb摄像头
  4. DHCP服务的八种报文(消息)作用
  5. LCL三相PWM整流器数学模型
  6. 对自我认知四象限理解
  7. win7计算器左移、右移操作
  8. 原来大家最拼命的时候是这样子的。
  9. 一、音频基础知识 - 耳机接口标准
  10. 中国接线端子行业研究与投资前景研究报告(2022版)