【复杂网络建模】——XGI库进阶学习:生成随机超图

目录

一、构建随机超图

二、绘制随机超图

三、其他功能

3.1 访问超图的最大阶

3.2 列出所有边尺寸

3.3 边大小的直方图

3.4 节点度直方图 


一、构建随机超图

XGI(eXtensible Graphs and Hypergraphs)是一个Python库,专注于超图(hypergraphs)的创建、操作和分析。它提供了一个灵活的框架来处理超图结构,包括无向和有向超图。XGI扩展了现有图处理库的功能,如NetworkX,通过引入对超边(hyperedges)的支持,这些超边可以连接两个以上的顶点,为研究者和开发者提供了一种强大的工具来探索超图理论以及在各种领域中的应用,如社会网络分析、生物信息学和复杂系统研究。

首先导入相关的python库:

import matplotlib.pyplot as plt
import numpy as np

import xgi

输出XGI的版本。 

xgi.__version__
N = 20
ps = [0.1, 0.01]
H = xgi.random_hypergraph(N, ps, seed=1)

该函数生成一个有N个节点的随机超图,任意d+1个节点与一个超边以概率ps[d-1]相连接。

可以打印超图,并像这样访问节点和边的列表:

print(H)
print(H.nodes)
print(H.edges.members())

二、绘制随机超图

可视化对于理解复杂的数据结构至关重要。要使用默认布局绘制超图,使用以下命令:

pos = xgi.barycenter_spring_layout(H, seed=1)
xgi.draw(H, pos=pos);

XGI还提供了几种方法来个性化高阶结构的绘图。

例如,我们可以将节点放置在一个圆圈上:

pos_circular = xgi.circular_layout(H)
xgi.draw(H, pos=pos_circular);

或者改变超边和链接的颜色: 

xgi.draw(H, dyad_color="tab:red", edge_fc="tab:orange", pos=pos);

xgi.draw(H, node_labels=True, pos=pos);

添加节点标签是另一个方便的功能: 

完整代码:

# — coding: utf-8 –
import matplotlib.pyplot as plt
import numpy as np

import xgi
print(xgi.__version__)

# Creating a Random Hypergraph
N = 20
ps = [0.1, 0.01]
H = xgi.random_hypergraph(N, ps, seed=1)

print(H)
print(H.nodes)
print(H.edges.members())


# Plotting a random hypergraph

pos = xgi.barycenter_spring_layout(H, seed=1)
# xgi.draw(H, pos=pos)

pos_circular = xgi.circular_layout(H)
# xgi.draw(H, pos=pos_circular)
# xgi.draw(H, dyad_color="tab:red", edge_fc="tab:orange", pos=pos)

xgi.draw(H, node_labels=True, pos=pos)

plt.show()

三、其他功能

3.1 访问超图的最大阶

xgi.max_edge_order(H)

这在处理更大、更复杂的结构时尤其有用。

3.2 列出所有边尺寸

要访问超图中所有的边大小,使用下面的命令:

xgi.unique_edge_sizes(H)

3.3 边大小的直方图

让我们更进一步,对超图进行更详细的分析:绘制边缘顺序的直方图。

首先,让我们创建一个更大更复杂的随机超图:

N_new = 50
ps_new = [0.1, 0.01, 0.001, 0.0001]
H_new = xgi.random_hypergraph(N_new, ps_new)

要访问边的顺序,请使用stats函数。要更深入地了解这一点,请查看关于统计的重点教程或查阅文档。可以获得所有边顺序的列表,然后以通常的方式创建直方图。

list_of_orders = H_new.edges.order.aslist()
plt.hist(
    list_of_orders,
    bins=range(min(list_of_orders), max(list_of_orders) + 2, 1),
    align="left",
)
plt.xticks(range(min(list_of_orders), max(list_of_orders) + 1, 1))
plt.xlabel("Order")
plt.ylabel("Number of edges");

3.4 节点度直方图 

类似地,使用stats函数,可以在超图中创建节点度的直方图:

nodes_degrees_list = H_new.nodes.degree.aslist()
plt.hist(
    nodes_degrees_list,
    bins=range(min(nodes_degrees_list), max(nodes_degrees_list) + 1, 1),
    align="left",
)
plt.xticks(range(min(nodes_degrees_list), max(nodes_degrees_list) + 1, 5))
plt.xlabel("Node degree")
plt.ylabel("Number of nodes");

  关于复杂网络建模,我前面写了很多,大家可以学习参考。

【复杂网络建模】——常用绘图软件和库_图论画图软件

【复杂网络建模】——Pytmnet进行多层网络分析与可视化

【复杂网络建模】——Python通过平均度和随机概率构建ER网络

【复杂网络建模】——通过图神经网络来建模分析复杂网络

【复杂网络建模】——Python可视化重要节点识别(PageRank算法)

【复杂网络建模】——基于Pytorch构建图注意力网络模型

【复杂网络建模】——Hypergraphx: 用于高阶网络分析的库

【复杂网络建模】——基于节点相似性的社团划分算法

【复杂网络建模】——链路预测算法及其应用

 【复杂网络建模】——ER网络度分布、无标度网络度分布

猜你喜欢

转载自blog.csdn.net/lxwssjszsdnr_/article/details/136962956