IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【复杂网络python】networkx有向加权网络紧密中心性计算(如何添加权重) -> 正文阅读

[Python知识库]【复杂网络python】networkx有向加权网络紧密中心性计算(如何添加权重)

学习复杂网络陷入误区,一直在思考度中心性是否需要加权?误认为中心性指标仅计算了度(无向网络中的度),没有考虑权重。结果忽略了中心性指标都是基于最短路径计算的(紧密中心性和中介中心性)。对此使用紧密中心性指标计算无权网络、加权网络、加权有向网络在数据基本一致的情况,该项指标是否有计算权重。

一、无向无权网络

(一)数据

1.节点数据(节点数据没有变化)在这里插入图片描述
(2)边数据(无权)(edge-11.txt)
在这里插入图片描述

(二)代码

import networkx as nx 
import matplotlib.pyplot as plt

column1 = []
with open('node-9.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        column1.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(column1)

edge = []
with open('edge-11.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        edge.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(edge)

G = nx.Graph()
G.add_nodes_from(column1)
G.add_edges_from(edge)
  
nx.draw_networkx(G,pos=nx.shell_layout(G),node_size=20,node_shape='o',width=1,style='solid',font_size=8) 
plt.show()

#计算紧密中心度(无权重无向)
print("无权重无向Closeness centrality")
c = nx.closeness_centrality(G)
for v in G.nodes():
    print(v, c[v])

结果
在这里插入图片描述

二、无向加权网络

(一)数据

1.节点数据(节点数据没有变化)在这里插入图片描述
(2)边数据(加权)(edge-10.txt)
在这里插入图片描述

(二)代码

import networkx as nx 
import matplotlib.pyplot as plt


column1 = []
with open('node-9.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        column1.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(column1)

edge = []
with open('edge-10.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        edge.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(edge)

G = nx.Graph()
G.add_nodes_from(column1)
G.add_weighted_edges_from(edge)
 
 
nx.draw_networkx(G,pos=nx.shell_layout(G),node_size=20,node_shape='o',width=1,style='solid',font_size=8) 


plt.show()


####------紧密中心性-------#########
#计算紧密中心度(有权重无向)
print("无向加权Closeness centrality")
c = nx.closeness_centrality(G)
for v in G.nodes():
    print(v, c[v])

结果
在这里插入图片描述

三、加权有向网络(变化权重)

(一)数据

1.节点数据(节点数据没有变化)在这里插入图片描述
(2)边数据(加权)
在这里插入图片描述

(二)代码

import networkx as nx 
import matplotlib.pyplot as plt


column1 = []
with open('node-9.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        column1.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(column1)

edge = []
with open('edge-10.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        edge.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(edge)

G = nx.DiGraph()
G.add_nodes_from(column1)
G.add_weighted_edges_from(edge)
 
 
nx.draw_networkx(G,pos=nx.shell_layout(G),node_size=20,node_shape='o',width=1,style='solid',font_size=8) 


plt.show()


####------紧密中心性-------#########
#计算紧密中心度(加权有向)
print("加权有向Closeness centrality")
c = nx.closeness_centrality(G)
for v in G.nodes():
    print(v, c[v])

结果
在这里插入图片描述

四、加权为1有向网络

(一)数据

1.节点数据(节点数据没有变化)在这里插入图片描述
(2)边数据(加权为1)(edge-12.txt)
在这里插入图片描述

(二)代码

import networkx as nx 
import matplotlib.pyplot as plt


column1 = []
with open('node-9.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        column1.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(column1)

edge = []
with open('edge-12.txt','r') as f:
    line = f.readline() # 读取一行
    while line:
        txt_data = eval(line) # 可将字符串变为元组
        edge.append(txt_data) # 列表增加
        line = f.readline() # 读取下一行
#print(edge)

G = nx.DiGraph()
G.add_nodes_from(column1)
G.add_weighted_edges_from(edge)
 
 
nx.draw_networkx(G,pos=nx.shell_layout(G),node_size=20,node_shape='o',width=1,style='solid',font_size=8) 


plt.show()


####------紧密中心性-------#########
#计算紧密中心度(加权有向)
print("加权1有向Closeness centrality")
c = nx.closeness_centrality(G)
for v in G.nodes():
    print(v, c[v])

结果
在这里插入图片描述

五、结果

无向无权结果:
在这里插入图片描述
无向加权结果:
在这里插入图片描述
加权(带权重)有向结果:
在这里插入图片描述
加权(加权为1)有向结果:
在这里插入图片描述

对比结果可以发现,紧密中心性在无向网络和有向网络中计算结果是不一致的,但是无向无权和无向加权网络中的紧密中心性结果一致,有向加权为1和有向加权(随机权重)网络中的紧密中心性结果一致,因此可以得出结论:无向和有向网络紧密中心性计算结果不一致;但是有向网络中,权重并没有影响紧密中心性,紧密中心性closeness_centrality中使用的Dijkstra算法并没有使用边的权重。对此,就要思考,Dijkstra算法可以添加属性权重,closeness_centrality在“拿来用”的时候,是怎么把这个属性显示出来?

对此可以观察下紧密中心性的计算原理:
亲近中心性的计算步骤:
1.使用Dijkstra算法计算每对节点间的最短路径,并将这些距离存储在一张表中。

2.对每个节点:a. 计算所有其他节点的平均距离 b.除以最大距离 c.亲近性=1/平均距离

其结果是一个介于0到1的数值:值越高意味着亲近中心性更大(平均距离越低)。(更常见的是将该分数归一化,使该得分代表最短路径的平均长度,而不是它们的总和。这种调整允许比较不同大小图节点的紧密性中心性。
归一化后的紧密中心性公式如下:
在这里插入图片描述
在这个公式中

  • u是一个节点。
  • n是图中的节点数。
  • d(u,v)是另一个节点V和U之间的最短路径距离。(Dijkstra算法

再来看下Networkx官方给出的函数:
在这里插入图片描述
(closeness distance 函数计算有 向图的传入距离。要使用向外距离。)
发现这个函数可以添加参数:
在这里插入图片描述
因此可以猜想,这个是否就是继承Dijkstra算法添加权重的参数呢?接下来使用权重为1和权重随机的有向网络对比验证一下。

六、正确添加权重

c = nx.closeness_centrality(G,distance='weight')

下面的区别是边的数据不一样

1.加权(随机)有向网络

边数据:edge-10.txt

print("加权有向Closeness centrality")
c = nx.closeness_centrality(G,distance='weight')
for v in G.nodes():
    print(v, c[v])

结果1:
在这里插入图片描述

2.加权为1有向网络

边数据:edge-12.txt

#计算紧密中心度(加权为1有向)
print("加权1有向Closeness centrality")
c = nx.closeness_centrality(G,distance='weight')
for v in G.nodes():
    print(v, c[v])

结果2:
在这里插入图片描述
结果不一致,而且结果2和未加distance='weight’的加权(带权重)有向结果、加权(加权为1)有向结果一致(详看第五章 五、结果),说明在未写distance参数时,distance默认为1,nx.closeness_centrality(G,distance=1)。

通过网络查询,ucinet计算紧密中心性是可以选择是否加权,说明其实这个软件基本满足我们的需求。由于一开始就是学习gephi,而且可视化较好,就不再学习ucinet去验证了。会使用的小伙伴可以拿这个数据去验证下。
(写于2021.8.26;2021.8.27修改,增加第六章。)

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 11:48:56  更:2021-08-27 11:50:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 11:56:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码