目录
0.简介
1.前提
1)ctrl + R 唤出cmd
2)安装networkx
3)查看networkx版本
2.方法一:通过给出无向图计算特征向量中心度
1)给出无向图,添加节点和边
2)可以用以下代码将无向图用pyplot库绘制出来
3)求特征向量中心度(就是用接口算的,调用很简答)
4)循环读取并显示结果
5)完整代码
6)需注意
3.方法二:读取csv文件中的邻接矩阵,计算特征向量中心度
1)读取csv文件中的邻接矩阵
2)计算其特征向量中心度,并返回一个结果数组
3)调用函数,打印结果
4)完整代码
3.参考:
0.简介
一个小项目,要求通过python代码计算无向图邻接矩阵的特征向量中心度,这里无向图的邻接矩阵有两种形式给出:
1)使用“G = nx.Graph()”方式在代码里给出无向图的边和节点,对这个无向图求特征向量中心度
2)读取一个csv文件中的邻接矩阵,然后计算这个邻接矩阵的特征向量中心度
两种方式,下文都有详述,可根据自己的需求选择合适的方法
开发背景:windows + eclipse(Version: 2021-06 (4.20.0)) + python
什么是无向图的特征向量中心度?
- 无向图的特征向量中心度是一种衡量图中节点重要性的指标,它基于图中节点之间的连接关系。特征向量中心度的计算涉及到图的特征向量和特征值。
- 在无向图中,一个节点的特征向量中心度取决于与该节点相连的其他节点的中心度,并且这些中心度又取决于它们相连的节点,形成了一个递归的关系。因此,特征向量中心度可以被看作是一个节点的中心度与其邻居节点的中心度之间的加权关系。
- 总的来说,无向图的特征向量中心度是一种基于节点连接关系的衡量节点重要性的指标,它考虑了节点本身的重要性以及与其相连的节点的重要性,是网络分析中的一个重要概念。
1.前提
下载networkx库,要求有python环境,python环境搭建这里不做赘述,只说明networkx库的安装(windows)
1)ctrl + R 唤出cmd
2)安装networkx
命令:$ pip install networkx
$ pip install --upgrade networkx
3)查看networkx版本
命令: $ pip show networkx
有如下提示信息为安装成功
2.方法一:通过给出无向图计算特征向量中心度
用到的库:networkx、matplotlib.pyplot
我自定义的无向图如下(全文都会以这个图为例)
1)给出无向图,添加节点和边
- 添加节点接口【add_nodes_from】很好理解:就是有几个节点,名字是什么就写什么;
- 添加边接口【add_edges_from】:每个元组指的是哪两条边的连接,如('V1', 'V2'),指的就是V1节点与V2节点是连接的,然后将所有的连接都写进去即可
G = nx.Graph()
#添加节点
G.add_nodes_from(['V1', 'V2', 'V3', 'V4', 'V5','V6', 'V7', 'V8', 'V9', 'V10', 'V11'])
#添加边
G.add_edges_from([('V1', 'V2'), ('V1', 'V3'), ('V1', 'V4'),('V1', 'V5'),('V1', 'V6'),('V1', 'V7'),('V1', 'V8'),('V1', 'V9'),('V1', 'V10'),('V1', 'V11'),
('V10', 'V3'), ('V11', 'V3')])
2)可以用以下代码将无向图用pyplot库绘制出来
(此部分代码也可以不加,属于可选)
#绘制无向图
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True)
plt.show()
3)求特征向量中心度(就是用接口算的,调用很简答)
#求特征向量中心度
centrality = nx.eigenvector_centrality(G)
4)循环读取并显示结果
#循环读取V1-V11
nodes = ['V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10', 'V11']
for node in nodes:
node_centrality = centrality[node]
print(f" {node} : {node_centrality}")
至此,即可查看打印数据
5)完整代码
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
#添加节点
G.add_nodes_from(['V1', 'V2', 'V3', 'V4', 'V5','V6', 'V7', 'V8', 'V9', 'V10', 'V11'])
#添加边
G.add_edges_from([('V1', 'V2'), ('V1', 'V3'), ('V1', 'V4'),('V1', 'V5'),('V1', 'V6'),('V1', 'V7'),('V1', 'V8'),('V1', 'V9'),('V1', 'V10'),('V1', 'V11'),
('V10', 'V3'), ('V11', 'V3')])
#绘制无向图
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True)
plt.show()
#求特征向量中心度
centrality = nx.eigenvector_centrality(G)
#循环读取V1-V11
nodes = ['V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10', 'V11']
for node in nodes:
node_centrality = centrality[node]
print(f" {node} : {node_centrality}")
6)需注意
在我的环境中,直接运行代码会报错:
SyntaxError: Non-UTF-8 code starting with '\xcc' in file D:\appDownload\eclipse\workspace\CSE598-proj1\test.py on line 7, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details
是文字编码的问题,只需要在第一行加上如下代码即可正常运行:
#coding=gb2312
3.方法二:读取csv文件中的邻接矩阵,计算特征向量中心度
用到的库:numpy、networkx、pandas、matplotlib.pyplot
csv邻接矩阵如下(与上文的无向图保持一致),我的csv文件名为【submission.csv】
1)读取csv文件中的邻接矩阵
#读取邻接矩阵
def read_adjacency_matrix_from_csv(csv_file):
adjacency_matrix = pd.read_csv(csv_file, header=None)
return adjacency_matrix.values
2)计算其特征向量中心度,并返回一个结果数组
def eigenvector_centrality(csv_file):
adjacency_matrix = read_adjacency_matrix_from_csv(csv_file) #从 CSV 文件中读取邻接矩阵数据,并将其存储在变量 adjacency_matrix 中
G = nx.from_numpy_array(adjacency_matrix) #使用 NetworkX 库的 from_numpy_matrix 函数根据邻接矩阵创建一个图形 G
#绘制无向图
# pos = nx.spring_layout(G)
# nx.draw(G, pos, with_labels=True)
# plt.show()
# 计算特征向量中心度
centrality = nx.eigenvector_centrality(G)
# 将结果保存为数组形式
vector = None
vector = {i: centrality[node] for i, node in enumerate(G.nodes())}
return vector
# score should be a dictionary {0 : 0.0, 1 : 0.0, ..., n:value}
3)调用函数,打印结果
# 调用函数并打印结果
csv_file = 'submission.csv'
result = eigenvector_centrality(csv_file)
print(result)
4)完整代码
#coding=gb2312
import numpy as np
import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt
#读取邻接矩阵
def read_adjacency_matrix_from_csv(csv_file):
adjacency_matrix = pd.read_csv(csv_file, header=None)
return adjacency_matrix.values
def eigenvector_centrality(csv_file):
adjacency_matrix = read_adjacency_matrix_from_csv(csv_file) #从 CSV 文件中读取邻接矩阵数据,并将其存储在变量 adjacency_matrix 中
G = nx.from_numpy_array(adjacency_matrix) #使用 NetworkX 库的 from_numpy_matrix 函数根据邻接矩阵创建一个图形 G
#绘制无向图
# pos = nx.spring_layout(G)
# nx.draw(G, pos, with_labels=True)
# plt.show()
# 计算特征向量中心度
centrality = nx.eigenvector_centrality(G)
# 将结果保存为数组形式
vector = None
vector = {i: centrality[node] for i, node in enumerate(G.nodes())}
return vector
# score should be a dictionary {0 : 0.0, 1 : 0.0, ..., n:value}
# 调用函数并打印结果
csv_file = 'submission.csv'
result = eigenvector_centrality(csv_file)
print(result)
至此,可打印出所有节点的特征向量中心度(截屏长度有限,未截所有)
{0: 0.6619318243714181, 1: 0.19118323624411673, 2: 0.3620211736298043, 3: 0.19118323624411673, 4: 0.19118323624411673, 5: 0.19118323624411673, 6: 0.19118323624411673, 7: 0.19118323624411673, 8: 0.19118323624411673, 9: 0.2957445865798806, 10: 0.2957445865798806}
需注意:通过方法二打印出的数组,最终节点的命名是0-10(因为有11个节点),与方法一自定义的V1,V2-V10不太一样,仅此一点差别
3.参考:
如何使用netwokx进行复杂网络的中心性分析?_networkx 中心度-CSDN博客
复杂网络python中心度指标算法学习(画图、计算)_利用python计算网络节点degree、kshell、介数中心性、接近中心性、特征向量中-CSDN博客
--END--