【复杂网络建模】真实网络数据集的读取和操作

文章目录

    • 概要
    • 1.获取真实网络数据集的常用网址
      • 1.1 Network Repository.
      • 1.2 Stanford Large Network Dataset Collection
      • 1.3 KONCET
      • 1.4 Netzschleuder
    • 2. 网络分析
      • 2.1 计算度中心性
      • 2.2 绘制网络图
    • 小结

概要

在复杂网络建模中,使用真实的网络数据集是理解和分析现实世界网络结构的关键。接下来将介绍如何使用 Python 中的工具库(如 NetworkX、Pandas 和 Matplotlib)来读取、操作和分析真实的网络数据集。我们将以一个具体的例子来展示整个过程,包括数据集的获取、加载、可视化和基本分析。

1.获取真实网络数据集的常用网址

1.1 Network Repository.

提示:此数据集网站数据集是.zip格式,解压后的数据是.mtx格式
链接: https://networkrepository.com/index.php

  • 将下载下来的数据集解压缩
import zipfile

f = zipfile.ZipFile("./data/inf-USAir97",'r') # 压缩文件位置

for file in f.namelist():
    f.extract(file,"./data")               # 解压位置
f.close()
  • 然后找到解压后的数据用记事本(或其他方式)打开,把前几行的非连边数据用%号注释掉
# 读取 .mtx 文件
matrix = mmread('./data/inf-USAir97.mtx')
# 转换为 NetworkX 图对象
G = nx.Graph(matrix)
# 输出节点数量和边数量
num_nodes = G.number_of_nodes()
num_edges = G.number_of_edges()
print(f"Number of nodes: {num_nodes}")
print(f"Number of edges: {num_edges}")
#Number of nodes: 332
#Number of edges: 2126

1.2 Stanford Large Network Dataset Collection

提示:此数据集网站数据集是.txt.gz格式
链接: https://snap.stanford.edu/data/

  • 读取数据
facebook = pd.read_csv(
    "./data/facebook_combined.txt.gz",
    compression="gzip",
    sep=" ",
    names=["source", "target"],
)
  • 输出网络节点和连边
# 输出网络信息
G = nx.from_pandas_edgelist(facebook, "source", "target")
print(nx.number_of_nodes(G), nx.number_of_edges(G))
  • 绘制网络图
# 绘制网络图
pos = nx.kamada_kawai_layout(G)
nx.draw(G, pos, node_color='red', edge_color='blue', with_labels=True)

1.3 KONCET

提示:此数据集网站数据集为.tar.bz2格式
链接: http://konect.cc/networks/

  • 解压.tar.bz2文件
# 解压.bz2文件
import tarfile
f = tarfile.open('./data/download.tsv.ucidata-zachary.tar.bz2','r:bz2')
for file in f:
    f.extract(file, r'./data') # d:mydirectory is where I want to uncompress the files.
f.close()
  • 输出网络连边
G = nx.read_edgelist("./data/ucidata-zachary/out.ucidata-zachary",  comments='%')
print(nx.number_of_nodes(G), nx.number_of_edges(G))
  • 绘制网络图
# 绘制网络图
pos = nx.kamada_kawai_layout(G)
nx.draw(G, pos, node_color='red', edge_color='blue', with_labels=True)

1.4 Netzschleuder

提示:此数据集网站数据集为.zip格式
链接: https://networks.skewed.de/

  • 读取数据
import zipfile
with zipfile.ZipFile("./data/network.csv.zip") as z:
   with z.open("edges.csv") as f:
      df = pd.read_csv(f)
        
print(df)
  • 输出网络信息
G = nx.from_pandas_edgelist(df, "# source", " target")
print(nx.number_of_nodes(G), nx.number_of_edges(G))
# 原始数据包含133280个节点,在直接读取连边数据时忽略了度为零的节点
G = nx.from_pandas_edgelist(df, "# source", " target", create_using = nx.MultiGraph())
print(nx.number_of_nodes(G), nx.number_of_edges(G))

2. 网络分析

2.1 计算度中心性

# 读取 .mtx 文件
matrix = mmread('./data/inf-USAir97.mtx')
# 转换为 NetworkX 图对象
G = nx.Graph(matrix)
# 计算度中心性
degree_centrality = nx.degree_centrality(G)
# 输出度中心性最高的节点
max_degree_node = max(degree_centrality, key=degree_centrality.get)
max_degree = degree_centrality[max_degree_node]
print(f"Node with highest degree centrality: {max_degree_node}, Degree centrality: {max_degree}")
# Node with highest degree centrality: 117, Degree centrality: 0.4199395770392749

2.2 绘制网络图

import networkx as nx
import matplotlib.pyplot as plt
import random
import numpy as np

# 定义一个函数来生成爱心形
def heart_layout(n):
    t = np.linspace(0, 2*np.pi, n)
    x = 16 * np.sin(t)**3
    y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)
    return np.column_stack([x, y])

# 创建一个包含200个节点的随机图
G = nx.gnp_random_graph(200, 0.05)

# 随机分配节点和边的颜色
node_colors = [random.choice(['red', 'blue', 'green', 'yellow', 'purple', 'orange']) for _ in range(len(G.nodes))]
edge_colors = [random.choice(['red', 'blue', 'green', 'yellow', 'purple', 'orange']) for _ in range(len(G.edges))]

# 绘制网络图
plt.figure(figsize=(12, 10))

# 使用自定义的爱心布局
pos = heart_layout(len(G.nodes))

# 绘制节点
nx.draw_networkx_nodes(G, pos, node_size=100, node_color=node_colors, alpha=0.8)

# 绘制边,增加边的宽度
nx.draw_networkx_edges(G, pos, width=2.0, alpha=0.6, edge_color=edge_colors)

# 显示图的中文标题
plt.title("YunRong_Love_Network", fontsize=16)

# 隐藏坐标轴
plt.axis('off')

# 显示图形
plt.show()

小结

本文展示了如何使用 Python 中的 Pandas、NetworkX 和 Matplotlib 库来读取、处理和分析真实的网络数据集。通过这些工具,我们可以轻松地导入数据、构建图结构、进行可视化和进行基本的网络分析。这些技术不仅适用于社交网络数据,还可以应用于其他领域的复杂网络建模和分析中。

你可能感兴趣的:(复杂网络,Python,python)