复杂网络学习笔记:networkx实现网络的基本拓扑性质

1、复杂网络的连通性

1.1、无向网络中的巨片

首先考虑地球上所有人类组成的社会网络的连通性;很显然整个网络是不连通的,因为只要有一个人没有朋友或者说只要有一小群人没有除了这群人之外的朋友那么整个网络就不连通。
由此可见,对于大规模网络来说,连通性非常脆弱,只要单个节点或者小部分节点的行为都有可能破坏连通性。
我们可以看出大规模复杂网络可能会出现一个大的连通片,这个连通片包含整个网络中的大部分节点,那么称这个连通片为巨片

1.2、有向网络中的蝴蝶结结构

1、强连通核(Strongly Connected Core,SCC):也成为强连通巨片,位于网络中心。SCC中任意两个节点之间都是强连通的,即存在从任意节点到另一节点的有向路径。
2、入部(IN):
3、出部(OUT):
4、卷须(Tendrils):
5、管子(Tube):

2、节点的度与网络稀疏性

2.1、 度与平均度

度(Degree)是刻画单个节点属性的最简单而又最重要的概念之一。
无向网络中节点 i 的度定义为与节点 i 直接相连的边的数目。
网络中所有节点的度的平均值成为网络的平均度(average degree),记为 <k> 。

import networkx as nx
#生成一个n=1000,起始节点为3的BA无标度网络
G = nx.random_graphs.barabasi_albert_graph(1000,3) 
#返回某个节点的度  
G.degree(0)
#返回所有节点的度                                  
G.degree()
#返回图中所有节点的度分布序列(从1至最大度的出现频次)                                     
nx.degree_histogram(G)    
#可返回单个节点的度,也可返回所有节点的度
def degree(G, nbunch=None, weight=None):
    """Returns a degree view of single node or of nbunch of nodes.
    If nbunch is omitted, then return degrees of *all* nodes.
    """
    return G.degree(nbunch, weight)
#返回图中所有节点的度分布序列(从1至最大度的出现频次) 
def degree_histogram(G):
    """Returns a list of the frequency of each degree value.

    Parameters
    ----------
    G : Networkx graph
       A graph

    Returns
    -------
    hist : list
       A list of frequencies of degrees.
       The degree values are the index in the list.

    Notes
    -----
    Note: the bins are width one, hence len(list) can be large
    (Order(number_of_edges))
    """
    counts = Counter(d for n, d in G.degree())
    return [counts.get(i, 0) for i in range(max(counts) + 1)]

2.2、出度与入度

有向网络中节点的度包括出度和入度
节点 i 的出度是指从节点 i 指向其他节点的边的数目

'''
	通过邻接矩阵来表示
'''
i的出度
k_out = 0
i = 任意节点数
for j in num_of_node:
	if a[i][j] != 0:
		k_out = a[i][j] + 1

节点 i 的入度是指从其他节点指向节点 i 的边的数目

'''
	通过邻接矩阵来表示
'''
i的入度
k_in = 0
i = 任意节点数
for j in num_of_node:
	if a[j][i] != 0:
		k_out = a[j][i] + 1

2.3、网络稀疏性与稠密化

一个包含N个节点的网络的密度(Density)ρ定义为网络中实际存在的边数M与最大可能边数之比。对于无向网络,我们有:
ρ = M 1 2 N ( N − 1 ) ρ=\frac{M}{\frac{1}{2}N(N - 1)} ρ=21N(N1)M
平均度和网络密度之间的关系:
< k > = 2 M N = ( N − 1 ) ρ ≈ N ρ <k> = \frac{2M}{N} = (N - 1)ρ ≈ Nρ <k>=N2M=(N1)ρ
将t时刻的网络中的节点数和边数分别记为N(t),M(t),如果两者呈线性比例关系,即N(t) ~ M(t),

以下是使用 NetworkX 计算网络基本拓扑性质的具体实现方法及相关指标说明:

一、基础拓扑属性计算

  1. 节点与边数量
# 节点数
node_count = G.number_of_nodes()
# 边数(无向图每条边计1次)
edge_count = G.number_of_edges()
  1. 平均度数
import numpy as np
degrees = [d for _, d in G.degree()]
avg_degree = np.mean(degrees)
  1. 密度计算
density = nx.density(G)  # 2*边数/(节点数*(节点数-1))

二、路径分析

  1. 最短路径与直径
# 节点0到42的最短路径
shortest_path = nx.shortest_path_length(G, source=0, target=42)
# 网络直径(最长最短路径)
diameter = nx.diameter(G)
  1. 平均路径长度
avg_path_length = nx.average_shortest_path_length(G)

三、聚类分析

  1. 局部聚类系数
# 单个节点聚类系数
clustering_0 = nx.clustering(G, 0)
# 全网络平均聚类系数
avg_clustering = nx.average_clustering(G)
  1. 全局聚类系数
transitivity = nx.transitivity(G)  # 三元闭包比例

四、度分布分析

from collections import Counter
degree_dist = Counter(degrees)
plt.bar(degree_dist.keys(), degree_dist.values())
plt.xlabel('Degree')
plt.ylabel('Frequency')

五、其他重要指标

指标类型NetworkX 实现方法典型应用场景
连通性检测nx.is_connected(G)网络完整性分析
度相关性nx.degree_assortativity_coefficient(G)同配性分析
中心性指标nx.degree_centrality(G)关键节点识别
模块度nx.algorithms.community.modularity社区发现

六、性能优化建议

  1. 大规模网络计算平均路径长度时,建议使用近似算法:
avg_path_approx = nx.approximation.average_shortest_path_length(G)
  1. 节点度数分布分析可结合幂律检测:
from powerlaw import Fit
fit = Fit(degrees)

应用案例参考:在 Facebook 社交网络分析中(4039 节点/88234 边),测得平均路径长度 3.69,直径 8,平均度数 43.69,显示出典型的小世界特性。实际应用中需注意:

  • 最短路径计算时间复杂度为 O(n^3),万级节点需分布式计算
  • 社区发现推荐使用 Louvain 算法(nx.community.louvain_communities
  • 可视化布局优先考虑 Fruchterman-Reingold 算法(nx.spring_layout

建议结合具体网络类型(有向/加权/多图)选择对应方法,如加权网络需在函数中指定 weight='weight' 参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xMathematics

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值