网络绘制、比较与有向网络分析
1. 网络绘制与比较
有四个网络,它们节点数量相同、密度相近(边的数量也相近),这使得它们很容易进行比较。以下是这四个网络的相关信息:
networks = {
"generalized" : generalized_network,
"pearson" : pearson_network_sign,
"cosine" : cosine_network,
"hamming" : hamming_network,
}
partitions = [community.best_partition(x) for x in networks.values()]
statistics = sorted([
(name,
community.modularity(best_part, netw),
len(set(best_part.values())),
len(nx.isolates(netw))
) for (name, netw), best_part in zip(networks.items(), partitions)],
key=lambda x: x[1], reverse=True)
这四个网络的模块化相关统计信息如下表所示:
| 相似度类型 | 社区数量 | 模块化程度 | 孤立节点数量 |
| — | — | — | — |
| Generalized | 4 | 0.47 | 0 |
| Pearson | 4 | 0.20 | 0 |
| Cosine | 6 | 0.04 | 4 |
| Hamming | 7 | 0.00 | 6 |
从表中可以看出,广义相似度网络没有孤立节点,模块化程度最高,检测到的社区数量最少。其社区结构将创伤类型划分为数量最少、定义明确且规模相近的组,这些组紧凑且同质,稍加努力即可进行标注,如下表所示:
| 创伤类型 | 组标签 |
| — | — |
| SEXUAL_ASSAULT, SEXUAL_ABUSE, KIDNAP, PSYC_MALTX, WAR, PHYSICAL_ABUSE, PHYSICAL_ASSAULT | 个人暴力 |
| WAR_NOT_US, TRAUMATIC_LOSS, INJURY_ACCIDENT, MEDICAL_TRAUMA | 医疗创伤 |
| SCHOOL_VIOLENCE, COMMUNITY_VIOLENCE, EXT_INTERPER_VIOLENCE | 社会创伤 |
| IMPAIRED_CAREGIVER, FORCED_DISPLACEMENT, DOMESTIC_VIOLENCE, NATURAL_DISASTER, NEGLECT | 忽视与搬迁 |
2. 发现不对称关系
有向网络是至少有一条有向边的网络。有向边具有方向,它连接节点 X 到节点 Y,但反之不成立,从数学角度看,有向边所代表的关系是不对称的。许多现实世界中的关系是不对称的,理想情况下应建模为有向网络,以下是一些例子:
-
社交网络
:
- 友谊:Alice 可能认为自己是 Bob 的朋友,但 Bob 可能有不同看法。若两人是相互朋友,既可以将他们的友谊建模为无向边,也可以创建两条反平行的有向边。
- 从属关系:若 Alice 是 Bob 的下属,那么 Bob 不是 Alice 的下属。
- 某些家庭关系,如亲子关系:若 Alice 是 Bob 的父母,那么 Bob 不是 Alice 的父母。
-
语义网络
:
- 上位词(更通用的词)或下位词(更具体的词)关系:颜色是红色的上位词,因为红色总是一种颜色,但反之不成立。
-
其他网络
:
- 成员关系:Alice 可以是一个组织的成员,但组织不能是 Alice 的成员。
- 顺序关系:若 A 在 B 之后发生,那么 B 不在 A 之后发生。
- WWW 链接:从一个网页到另一个网页的链接并不意味着有反向链接。
- 流:任何从一个节点到另一个节点的流(包括货物、人员、金钱和信息的流动)都是不对称的,必须建模为有向边,例如交通网络中的单行道就是有向边。
3. 有向网络与符号网络的区别
有向网络的不对称性与符号网络的不对称性有所不同,它们建模的方面不同。符号边(和其他加权边一样)表示关系的强度,而有向边表示关系的互惠性。一条边可以同时是有向的和加权/带符号的。以下表格展示了有向性和权重如何捕捉简单人际关系的不同方面:
| | 正符号 | 无符号 | 负符号 |
| — | — | — | — |
| 有向 | Alice 和 Bob 是朋友 | Alice 和 Bob 是熟人 | Alice 和 Bob 是敌人 |
| 无向 | Alice 喜欢 Bob(但 Bob 不喜欢 Alice) | Alice 认识 Bob(但 Bob 不认识 Alice) | Alice 讨厌 Bob(但 Bob 不讨厌 Alice) |
4. 探索有向网络
有向边的存在极大地影响了几乎所有的网络度量和结构元素,以下是一些受影响的属性:
-
度
:有向图 G 中的每个节点有三个度:
G.in_degree()
(入边的数量)、
G.out_degree()
(出边的数量)和
G.degree()
(所有边的数量),总度数是入度和出度的和。例如,在一个基于美国人口普查局州际迁移流量数据集构建的 2015 年每个州前三个首选迁移目的地的有向网络中,入度和总度数表明最具吸引力的目的地是加利福尼亚州、佛罗里达州和得克萨斯州,且所有节点的出度都为 3。
sorted(G.in_degree().items(), key=lambda x: x[1], reverse=True)[:3]
sorted(G.out_degree().items(), key=lambda x: x[1], reverse=True)[:3]
sorted(G.degree().items(), key=lambda x: x[1], reverse=True)[:3]
-
邻居
:有向图中的节点有两种类型的邻居:
G.successors()(通过出边可达的节点)和G.predecessors()(通过入边可达的节点),G.neighbors()是G.successors()的别名。在迁移网络中,最终目的地(如加利福尼亚州)的后继节点是迁出迁移的首选目的地,即移民来自的州;前驱节点则是迁移到该州的州。
final_destination = sorted(G.in_degree().items(), key=lambda x: x[1], reverse=True)[0][0]
coming_from = G.predecessors(final_destination)
going_to = G.successors(final_destination)
- 行走、轨迹和路径 :网络中的行走仍然是任何边的序列,使得一条边的终点是另一条边的起点。但有向边只有一个终点和一个起点,而无向边可以从其任意一个关联节点开始。由于这个额外的限制,一些无向行走可能会中断。
-
中心性和其他距离
:有向图中的每个节点有三个度中心性(
G.in_degree_centrality()、G.out_degree_centrality()和G.degree_centrality()),基于同名的度。其他类型的中心性(接近中心性、中介中心性和特征向量中心性)的计算方法与无向网络相同,但结果通常不同,因为邻域和路径不同。图的中心、直径、半径、离心率和外围也是如此。 -
组件
:有向网络有两种类型的组件:
- 强连通组件:其中任何成员节点都可以从任何其他成员节点到达。
- 弱连通组件:如果所有边都转换为无向边,任何成员节点都可以从任何其他成员节点到达。
sorted(nx.weakly_connected_components(G), key=len, reverse=True)
sorted(nx.strongly_connected_components(G), key=len, reverse=True)
-
反转和扁平化
:可以使用
G.reverse()方法反转有向图,该函数返回一个每条边都反转的原始图的副本。新图中的入度、出度、后继节点和前驱节点分别是原始图的出度、入度、前驱节点和后继节点。两个图具有相同的弱连通和强连通组件。还可以使用G.to_undirected(reciprocal=False)方法将有向图转换为无向图。如果reciprocal参数为True,则只有当两个节点已经由一对反平行有向边连接时,才会用无向边连接它们;否则,有向边会降为无向边,并且任何可能产生的平行边对会合并。
以下是有向网络相关操作的流程图:
graph LR
A[开始] --> B[创建有向网络]
B --> C[计算度、邻居等属性]
C --> D[检测组件]
D --> E[反转或扁平化网络]
E --> F[结束]
网络绘制、比较与有向网络分析
5. 对有向无环图应用拓扑排序
有向无环图(DAG)是一种特殊类型的有向网络,它是无环的,即不包含任何循环。从视觉上看,DAG 可以是树、森林、星型或线性图。有向无环图描述了层次结构,其中组件根据某些属性进行排序,任意两个组件 A 和 B 要么无关,要么 A 明确从属于 B,要么 B 明确从属于 A。而在有循环的有向图中,从属关系是模糊的。
有向无环图的边通常表示支配层次或从属关系,边的源节点是“老板”,目标节点是“下属”。例如,鸡群中的啄食顺序就有效地执行了拓扑排序,导致了社会分层。
NetworkX 中有几个专门用于 DAG 的函数:
-
nx.is_directed_acyclic_graph(G)
:检查 G 是否为 DAG。
-
nx.transitive_closure(G)
:计算 G 的传递闭包 T,即一个与 G 具有相同节点的图,使得 T 中两个节点相邻当且仅当 G 中这两个节点之间存在路径。可以将传递闭包看作是所有可能的从属关系(直接和间接)的图。
可以对 DAG 进行序列化,将所有节点排列成线性顺序,使得下一个节点可能是前一个节点的下属,但前一个节点永远不是下一个节点的下属。这个操作称为拓扑排序,一个 DAG 可以有多种不同的排序方式,得到不同的“啄食”排名。
nx.topological_sort(G)
函数返回一个随机选择的排名,作为节点标签的列表。
以下是一个简单的示例代码,展示如何使用这些函数:
import networkx as nx
# 创建一个有向无环图
G = nx.DiGraph()
G.add_edges_from([(1, 2), (2, 3), (1, 4)])
# 检查是否为 DAG
is_dag = nx.is_directed_acyclic_graph(G)
print(f"Is the graph a DAG? {is_dag}")
# 计算传递闭包
T = nx.transitive_closure(G)
print("Transitive closure nodes:", T.nodes())
print("Transitive closure edges:", T.edges())
# 进行拓扑排序
topological_order = list(nx.topological_sort(G))
print("Topological order:", topological_order)
6. 总结
本文主要围绕网络的绘制、比较以及有向网络的相关知识展开。首先对四个节点数量相同、密度相近的网络进行了绘制和比较,通过模块化相关统计信息发现广义相似度网络具有最佳的模块化结构,能够将创伤类型划分为明确的组。接着介绍了有向网络的概念,指出其存在不对称关系,并列举了社交网络、语义网络等多个领域中的不对称关系示例。同时对比了有向网络和符号网络,明确它们建模的不同方面。
在探索有向网络时,详细阐述了有向边对网络度量和结构元素的影响,包括度、邻居、行走、中心性、组件等属性,并给出了相应的代码示例。最后,介绍了有向无环图(DAG)的特点和应用,以及如何对其进行拓扑排序。
以下是对本文内容的一个总结表格:
| 内容 | 要点 |
| — | — |
| 网络绘制与比较 | 四个网络节点和密度相近,广义相似度网络模块化最佳 |
| 发现不对称关系 | 有向网络存在不对称关系,多领域有相关示例 |
| 有向与符号网络区别 | 符号边表示关系强度,有向边表示互惠性 |
| 探索有向网络 | 有向边影响度、邻居等多种网络属性 |
| 有向无环图拓扑排序 | DAG 无环,可进行拓扑排序确定节点顺序 |
通过这些内容的学习,我们可以更好地理解和处理各种类型的网络,为实际应用提供有力的支持。
以下是整个知识体系的流程图:
graph LR
A[网络绘制与比较] --> B[发现不对称关系]
B --> C[有向与符号网络区别]
C --> D[探索有向网络]
D --> E[有向无环图拓扑排序]
超级会员免费看
9万+

被折叠的 条评论
为什么被折叠?



