Python 中的网络分析

pythonserver side programmingprogramming

网络是节点和边的集合,表示这些节点之间的关系或连接。节点可以表示各种实体,例如个人、组织、基因或网站,而边表示它们之间的连接或交互。

网络分析是研究这些实体之间的关系,这些实体以网络表示为节点。在本文中,我们将了解如何使用 Python 实现网络分析。它涉及使用许多数学、统计和计算技术。网络分析可以深入了解复杂系统的行为,并有助于在各个领域做出明智的决策。

Python 为我们提供了一个名为 networkx 的包,它对复杂网络的创建、操作和分析有很大帮助。在继续阅读本文之前,我们将使用终端中的以下命令在 python 中安装 networkx 以进行网络分析:

pip install networkx

创建一个简单的图表

在这里,我们将使用 networkx 库创建一个简单的图表。它将由 3 个节点和 3 条边组成。然后,我们将计算每个节点的度和聚类系数,最后绘制图表。

节点的度:节点在图中拥有的邻居数。它可以通过计算连接到节点的边数来计算。

聚类系数:节点邻居相互连接程度的度量。换句话说,它是特定节点周围图中局部连接密度的度量。它是通过将节点邻居之间存在的边数除以此类边的最大可能数量来计算的。

示例

import networkx as nx
import matplotlib.pyplot as plt

# 创建一个空图
G = nx.Graph()

# 添加节点
G.add_node(1)
G.add_node(2)
G.add_node(3)

# 添加边
G.add_edge(1, 2)
G.add_edge(2, 3)
G.add_edge(3, 1)

print("Node degree:")
for nodein G.nodes():
    print(f"{node}: {G.degree(node)}")
# 聚类系数
print("节点聚类系数:")
for node in G.nodes():
    print(f"{node}: {nx.clustering(G, node)}")
# 绘制 图形
nx.draw(G, with_labels=True)
plt.show()

输出

节点度:
1:2
2:2
3:2
节点聚类系数:
1:1.0
2:1.0
3:1.0

识别社区

识别图中的社区是根据相似特征将图中的节点划分为组或集群的过程。为此,使用了 Louvain 算法。它是一种迭代算法,通过优化衡量给定社区结构模块度的质量函数来工作。模块度衡量社区内边数与随机图中预期边数相比的程度。

Louvain 算法分为两个阶段:

  • 该算法将每个节点分配给其自己的社区。然后迭代地在社区之间移动节点,以便可以增加模块度。这个过程不断重复,直到没有剩余的模块度改进空间。

  • 然后,该算法从第一阶段构建新的图,到达节点表示社区。边表示社区之间边的总权重。最后,将第一阶段应用于这个新图,以帮助在更粗粒度级别上识别社区。

Louvain 算法非常高效,可用于检测具有数百万个节点和边的大型图中的社区。

示例

import networkx as nx
import matplotlib.pyplot as plt

G = nx.gnm_random_graph(7,10)

# 绘制图形
print("原始图表:")
nx.draw(G,with_labels=True)
plt.show()

print("节点度:")
for node in G.nodes():
    print(f"{node}: {G.degree(node)}")

print("节点中介中心性:")
bc = nx.betweenness_centrality(G)
for node in bc:
    print(f"{node}: {bc[node]}")

# 使用 Louvain 算法进行社区识别
communities = nx.algorithms.community.modularity_max.greedy_modularity_communities(G)

# 打印社区以及每个社区中的节点数
i = 1
for c in communities:
    print(f"社区 {i}: {c}")
    i += 1
    print(f"节点数: {len(c)}")

color_map = []
for node in G.nodes():
    for i in range(len(communities)):
        if node in communities[i]:
        	color_map.append(i)

print("带有标记社区的图表:")

nx.draw(G, node_color=color_map, with_labels=True)
plt.show()

输出

节点度:
0:5
1:3
2:2
3:2
4:2
5:4
6:2
节点中介中心性:
0:0.5666666666666667
1:0.1
2:0.0
3:0.0
4:0.0
5:0.2
6:0.0
社区 1:frozenset({0, 2, 3, 4})
节点数:4
社区 2:frozenset({1, 5, 6})
节点数:3

分析同质性

同质性是指个体倾向于与具有与自己相似的特征或训练(如信仰、价值观或年龄、性别、种族等人口统计数据)的其他个体联系。

这是一种有据可查的社会现象,有助于分析网络。

我们将研究同质性在塑造网络结构方面的作用,包括相似节点相互连接的趋势。

图的同质性系数用于测量相似节点相互连接的趋势,该系数借助 nx.attribute_assortativity_coefficient() 函数计算,范围从 -1 到 1。正值表示可能性更大,负值表示可能性更小。

在下面的代码中,我们不仅计算了同质性系数,还通过为每个节点分配一个二进制属性"类型"来标记节点,以指示它是属于组 A 还是组 B。我们还绘制了节点按类型着色的图表,以可视化任何同质性模式。

示例

import networkx as nx
import matplotlib.pyplot as plt

G = nx.gnm_random_graph(50, 100)

# 每个节点的二进制属性,用于指示其类型
for node in G.nodes():
    G.nodes[node]['type'] = 'A' if node < 25 else 'B'

# 绘制 图形 并用其对应的类型 A 或 B 为节点着色
color_map = ['red' if G.nodes[node]['type'] == 'A' else 'blue' for node in G.nodes()]
nx.draw(G, node_color=color_map, with_labels=True)
plt.show()

homophily_coeff = nx.attribute_assortativity_coefficient(G, 'type')
print(f"同质性系数:{homophily_coeff}")

输出

同质性系数:-0.0843989769820972

结论

网络分析对于研究包括社交网络在内的复杂系统的结构和动态非常有用。Python 提供了各种库来实现这一点,但是 networkx 是最常用的库。使用 Python 中的网络分析,研究人员和分析师可以回答各种研究问题,例如识别关键节点和社区、测量网络的稳健性和弹性、检测同质性和社会影响的模式。虽然网络分析可能是一个复杂的技术领域,但只要仔细注意数据准备和清理,它可以帮助解决大量现实世界的问题,并帮助企业发展。


相关文章


有用资源