【python】networkx库计算:特征向量中心度

目录

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--

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每日一练】day3

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 🎈丠丠64-CSDN博客🎈 ✨✨ 帅哥美女们,我们共同加油!一起…

透视环世物流:一个AI降本的产业典型样本

在过去的多年时间里,与其说低代码完成的数字原生的普惠,不如说其最强的能力恰是能帮助企业用最低的门槛、最高的效率构建出与自身适配的流程和业务应用,在底层帮助企业构建出一个被极致拆分和分子化的软件开发中台。 而透过环世物流&#x…

Prometheus——部署详解

目录 一、Prometheus Server端安装和相关配置 1.上传安装包并解压 2.配置系统启动文件 3.启动 二、部署Node Exporters监控系统指标 三、监控Mysql配置示例 1.Mysql服务器操作 2.Prometheus服务器操作 四、监控Nginx配置示例 1.在Nginx服务器操作 2.Prometheus服务器…

Nexus搭建maven私有仓库

目录 1.Nexus介绍 2.操作步骤 1.下载Nexus 2.安装和启动nexus 3.使用私服 1.登录管理员 2.私服介绍 1.配置参数认识 2.创建仓库 4.maven使用私库 1.安装maven 2.配置maven 3.在项目中打包部署和发布 5.向私库添加jar包 ​1.添加jar 2.使用jar 1.Nexus介绍 内网…

水泥行业超低排放简介

在当今社会,随着环保意识的不断提高,水泥行业作为重要的工业领域,其超低排放的实施范围及成效日益受到人们的关注。朗观视觉小编将从多个角度探讨水泥行业超低排放的实施范围,分析其背后的意义与影响,展望未来的发展趋…

【Linux】段错误(核心已转储)(core dumped)问题的分析方法

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 🤓 同时欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深…

美摄科技匿名化处理解决方案,包含模糊、同色、马赛克、效果遮挡等各种形式

信息安全已成为企业发展中不可忽视的重要一环,随着信息安全法规的日益严格和公众对个人隐私保护意识的不断提高,企业如何在保障业务顺畅进行的同时,满足信息安全和隐私保护的要求,成为了亟待解决的问题。美摄科技凭借其强大的技术…

Stable Diffusion: ControlNet Canny检测

同样在ControlNet中,尝试换为Canny检测 拖放原始姿态图片。 勾选“启用”,“完美像素模式”,“允许预览” 控制类型选择“Canny(硬边缘)” 预处理器选“canny”,会对原始姿态图片做Canny边缘检测 模型部分会自动选…

端点物联开发教程之(二)开发演示

目录 一、产品定义 二、基础资源下载 三、嵌入式端开发 3.1 工程搭建 3.2 模型文件修改 3.3 头文件定义 3.4 模型功能开发 3.5 mqtt应用层配置 3.6启动任务 四、用户后端开发 4.1 功能分析 4.2 创建模型文件 4.3 添加基础功能 4.4 数据更新 4.5 阈值设置 4.6 模…

HCIA6以太网基础基于MAC划分VLAN

(简写的命令可以敲Tab按键补全剩余) 1.组网需求 场景:公司的网络中,管理者将同一部门的员工划分到VLAN10。要求只有本部门员工的PC接入才能互访,其他PC接入交换机属于其他VLAN(666)。可以配置…

Android WebSocket长连接的实现

一、为什么需要 WebSocket 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客…

【Three.js】知识梳理十九:线性雾(Fog)、指数雾(FogExp2)和范围雾(RangeFog)

雾是3D图形中创建深度和氛围的重要工具。Three.js提供了多种类型的雾:线性雾(THREE.Fog),指数雾(THREE.FogExp2)和范围雾(RangeFog)。本文将探讨这三种类型的雾,通过代码…

OLED柔性屏的显示效果如何

OLED柔性屏的显示效果非常出色,具有多方面的优势。以下是关于OLED柔性屏显示效果的详细分析: 色彩表现:OLED柔性屏的每个像素都可以独立发光,因此色彩准确性极高。黑色呈现得非常深邃,而亮部则展现出鲜明而生动的细节。…

Python-docx将Word文档的目录或文本框作为普通段落读入

📢作者: 小小明-代码实体 📢博客主页:https://blog.csdn.net/as604049322 📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论! 昨天我们处理Word文档的自动编号,详见《Python解析Wo…

maven 显式依赖包包含隐式依赖包,引起依赖包冲突

问题:FlinkCDC 3.0.1 代码 maven依赖包冲突 什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突 依赖冲突的原因 依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它…

springbot 界面美观的超市收银管理系统。

springbot 界面美观的超市收银管理系统。 功能:登录,用户管理,权限菜单管理,首页订单,收入,用户统计, 收银台,销售账单,库存管理,商品分类,供应…

如何在浏览器书签栏设置2个书签实现一键到达网页顶部和底部

本次设置浏览器为:Chrome浏览器(其他浏览器可自行测试) 1,随便收藏一个网页到浏览器书签栏 2,右键这个书签 3,修改 4,修改名称 5,修改网址: javascript:(function(…

Vue3中使用深度选择器不起作用

问题: 想要给这个菜单设置高度100%,使用深度样式选择器无效 这样写无效 但是如下在控制台写是有效果的 解决: 参考 解决方法是给这个组件增加一个根元素,然后再使用深度选择器

【Linux】线程(一)

谈论之前需要先谈论一些线程的背景知识 其中就有进程地址空间,又是这个让我们又爱又恨的东西 目录 背景知识:地址空间: 背景知识: 地址空间: 说在前边,OS通常分为4个核心模块:执行流管理&…

IDEA项目上传Github流程+常见问题解决

一、Github上创建仓库 项目创建好后如图所示 二、IDEA连接Github远程仓库 管理远程 复制远程地址 定义远程 登录Github 点击进入File->Settings->Version Control->Github登录自己的账号并勾上“√” 三、推送项目 点击推送 修改为main 点击确定,打开远程…