在线开源学习地址:https://github.com/XL-lab-bigdata/ComplexNetworks

高阶网络:让我们真正“读懂”复杂系统的秘密语言

在过去,我们常用图(Graph)来描述现实世界中的各种网络关系,比如社交网络中的“谁认识谁”、交通网络中的“从哪里到哪里”。这些网络大多只关注两个节点之间的连接关系,比如 A → B,B → C……

但现实世界远没有这么简单!

很多系统中,一个节点的行为不仅仅受前一个节点的影响,还会受到它之前所走过的“路径”或“组合”的影响。这就是我们要聊的主角——高阶网络(Higher-order Networks)

为什么我们需要高阶网络?

想象你在研究人群的迁徙路径。从“家”出发的人如果先去了“公司”,接着可能去“咖啡馆”;但如果先去了“健身房”,也许之后就会去“超市”。
也就是说:“下一个目的地”不仅跟当前的位置有关,还和之前去过的地方有关。

这种“依赖历史轨迹”的行为,在许多复杂系统中都非常常见,比如:

  • 社会网络(朋友圈组合、会议对话顺序);
  • 神经网络(多个神经元协同发放);
  • 生物网络(多个基因同时参与某一功能);
  • 交通系统(路线依赖历史选择)……

传统图结构是“点对点”的,但这些系统需要的是“多点协同”的建模工具,这正是高阶网络大展拳脚的地方!

高阶网络是什么?

通俗点说,高阶网络就是让我们从“成对关系”升级为“多元关系”的建模方式,它更擅长处理那些涉及多个节点共同作用或行为依赖历史轨迹的情况。

在这一章中,我们主要会围绕两个核心概念展开:

  • 高阶相互作用(Higher-order Interaction)
  • 高阶依赖(Higher-order Dependency)

1. 什么是高阶相互作用?

我们先从“相互作用”说起。传统网络里,我们一般只考虑两个节点之间的连接关系,比如 A 和 B 是好友。但在现实中,很多互动是由三人及以上组成的群体完成的

比如:

  • 在遗传研究中,一个疾病可能由多个基因协同影响;
  • 在神经网络中,三个以上神经元的联动激活,才会触发某种反应;
  • 在科研合作中,三位研究者一起署名才构成一篇论文的真正“合作”。

这类场景中,“只考虑两两连接”就会丢失重要的信息,甚至得出错误结论。

高阶相互作用定义
系统中三个或以上的节点之间共同参与某种互动过程(而不是简单的点对点联系)即构成高阶相互作用。

你可以把它想象成一张“合作表”,每一组被圈在一起的节点,代表一次集体行为或联合互动。


2. 什么是高阶依赖?

“高阶依赖”主要用在带有时间顺序的数据中。

举个例子:

  • 你在看网页,点完首页、点了“推荐”,下一步可能点“详情”;
  • 但如果你是从“搜索”进来的,再点“推荐”,你可能不会点“详情”,而会跳转去“评价”。

也就是说:你当前的选择,不仅受当前页面影响,还受到前面的点击路径影响。

高阶依赖定义
当前状态的转移概率不仅与当前位置有关,还与前面的状态轨迹相关。

这类场景在交通、推荐系统、行为建模、甚至流行病传播中都非常常见。而传统的一阶模型(Markov模型)忽略了这种“路径记忆性”,预测能力就会受到很大限制。

什么是“单纯复形”?读懂这个强大的建模工具!

我们需要一个更“聪明”的工具,来描述多个节点之间的复杂互动。

下面就来讲讲这个工具之一:单纯复形(Simplicial Complex)

一句话理解“单纯复形”

单纯复形其实是拓扑学里的一个概念,用来表示多个点之间的几何关系。但别担心,我们不是在学纯数学,而是借用这个概念来建模多体交互。

你可以简单把它理解为:

把点、线、三角形、四面体……这些基本几何结构看作“群体交互”的最小单元,用来表示多个节点的共同作用


从“单纯形”开始理解

我们先来搞清楚基础单位:“单纯形”。

维度名称含义图示
00-单纯形单个节点一个点
11-单纯形两个节点之间的连边一条线
22-单纯形三个节点共同形成的三角形关系一个三角形
33-单纯形四个节点形成的四面体一个立体

如果三个学者共同完成了一项研究,我们就可以用一个“2-单纯形”来表示这种三人协作关系。


什么是“单纯复形”?

单纯复形就是多个单纯形按照规则组合而成的集合,它就像一个“高阶结构拼图”,可以非常优雅地刻画“层次化的多体互动关系”。

一个合格的“单纯复形”必须满足两个条件:

  1. 包含其所有子结构
    也就是说,如果一个三角形(2-单纯形)在集合中,那么它的三条边(1-单纯形)和三个点(0-单纯形)也必须在里面。
  2. 单纯形之间只能共享“合法”部分
    任意两个单纯形要么没有交集,要么它们的交集必须也是一个“合法的子单纯形”。

图示理解:
在这里插入图片描述

想象你有8个节点,有两个三角形结构(例如节点1-2-3 和节点6-7-8),中间还有若干边连接其他点。这就是一个由多个不同维度单纯形组成的“单纯复形”。

实例:生态系统中的“单纯复形”

我们用一个生态系统的例子来理解:
在这里插入图片描述

  • 假设物种1、2、3彼此存在共生关系
  • 物种4和5之间存在捕食关系

我们可以构建一个单纯复形:

  • 所有5个物种 → 0-单纯形
  • 共生边1-2、1-3、2-3和捕食边4-5 → 1-单纯形
  • 三个共生物种1-2-3 → 2-单纯形

这个结构非常直观地表现出“谁和谁是群体关系”,也比传统“点-线”图更有表现力。

怎么表示单纯复形?邻接张量登场!

传统网络用邻接矩阵,但它只能表示两两之间的关系。

单纯复形的高阶特性,需要我们使用更强大的结构:邻接张量(Adjacency Tensor)

简单来说:

  • 一阶关系(线):二维矩阵
  • 二阶关系(三角形):三维张量
  • 三阶关系(四面体):四维张量
    …以此类推。

在具体计算时,这些张量能告诉我们哪些节点共同构成了一个高阶结构,也为后续的分析(比如社团检测、传播模拟)提供数据基础。

高阶网络里的“重要节点”怎么看?——单纯复形中心性指标全解析

在传统网络里,我们通常会问:“谁最重要?”我们用 度中心性介数中心性特征向量中心性 等指标来衡量。

但在高阶网络中,节点之间不是简单的一对一关系,而是可以三三成团、四四结组……这时候,传统的中心性就不太够用了。

于是,研究者提出了基于 单纯复形(Simplicial Complex) 的高阶中心性指标。

我们带大家重点认识两个核心指标:

  • 高阶度(SHOD)
  • 高阶 H 指数(HOH)

什么是“单纯复形”?

简单回顾一下:在高阶网络中,一个由多个节点组成的结构叫做z-单纯形。例如:

  • 两个节点:边 → 1-单纯形
  • 三个节点:三角形 → 2-单纯形
  • 四个节点:四面体 → 3-单纯形

而多个单纯形按照某种规则组合起来,就构成了单纯复形网络。


高阶度(SHOD)

高阶度,是指一个单纯形与多少同阶的其它单纯形有重叠节点。

比如,对于一个三角形(2-单纯形)来说,如果它与其他的三角形共享至少一个顶点,就算是“邻居”。

公式:
H D ( z ) ( α ) = ∑ i = 0 n C N ( α , β i ) HD^{(z)}(\alpha) = \sum_{i=0}^{n} CN(\alpha, \beta_i) HD(z)(α)=i=0nCN(α,βi)

其中:

  • α \alpha α 是你要计算的 z-单纯形
  • β i \beta_i βi 是其它 z-单纯形
  • C N ( α , β i ) = 1 CN(\alpha, \beta_i) = 1 CN(α,βi)=1 表示它们有公共节点,否则为 0

通俗理解:就是“和我同类型(如都是三角形)的结构中,有多少个跟我沾亲带故的”。


高阶 H 指数(HOH)

HOH 是度量一个单纯形的“高阶邻居里,有多少个也很活跃”。

灵感来源于学术界著名的 H-index,这个指数不是简单看你有多少“朋友”,而是看你的“朋友里有多少是大佬”。

定义:

某个单纯形的 HOH 为 H H H,表示它的高阶邻居中,至少有 H 个邻居的高阶度也 ≥ H


举个例子:

假设某个三角形(2-单纯形)的高阶邻居(也都是三角形)有如下高阶度:

(6,6,4,8,5,8,6)(6, 6, 4, 8, 5, 8, 6)(6,6,4,8,5,8,6)

问这个三角形的高阶 H 指数是多少?

答案:5

因为其中至少有 5 个邻居的高阶度都 ≥ 5(分别是 6, 6, 8, 5, 8)。

单纯复形 + 藏本模型:看高阶网络如何刻画电力系统的同步过程

在电力系统中,同步是个至关重要的问题。想象一下,我们有一堆发电机,它们必须“心有灵犀”地运转在相同的频率和相位上,电网才能稳定运行。然而,随着系统越来越复杂、设备越来越多,要维持这种协同可不是件容易的事。

这时候,藏本模型(Kuramoto Model)就派上了用场。更棒的是,我们还可以用高阶网络理论中的“单纯复形”来建模电力系统中三机协同甚至更多元的交互结构。我们就一起来看看:单纯复形藏本模型是如何帮助我们模拟电力系统中的同步现象的。


问题背景:复杂电网需要更强的建模方式

传统的图模型虽然好用,但只能描述节点之间的一对一连接。而在现实电力系统中,发电机之间的关系并不总是成对的:比如,三台发电机可能一起形成一个协同工作组。这种“多个节点一起作用”的关系就需要用更高级的结构来描述——单纯复形

同时,我们希望模拟这些发电机的运行状态如何随着时间变化趋于同步,这时就引入了藏本模型——一个专门用来研究振荡系统同步性的数学工具。

数据和模型搭建

我们设计了一个包含 5 台发电机的简化电力系统模型:

  • 发电机 {1,2,3} 和 {2,3,4} 分别构成两个三机协同组(2-单纯形)
  • 发电机 {4,5} 之间存在直接连接(1-单纯形)

用 Python 的 xgi 库来建模如下:

import xgi

S = xgi.SimplicialComplex([[1, 2, 3], [2, 3, 4], [4, 5]])
xgi.draw(S)
print(S.edges.members())

在这里插入图片描述

设置模拟参数

我们将这些高阶结构视作“振荡单元”,定义它们的固有频率和初始相位,然后设定模拟时间、耦合强度等:

import numpy as np

order = 1  # 我们对1阶结构(即边)进行模拟
n = len(S.edges.filterby("order", order))

omega = np.random.rand(n, 1)  # 随机固有频率
theta0 = 2 * np.pi * np.random.rand(n, 1)  # 初始相位
sigma = 0.4  # 耦合强度
T = 30       # 总模拟时间
n_steps = 5000  # 时间步长

通过 xgi.synchronization 模块运行模拟:
from xgi import synchronization

results = synchronization.simulate_simplicial_kuramoto(
    S,
    orientations={eid: 0 for eid in list(S.edges.filterby("order", 1, mode="geq"))},
    order=order,
    omega=omega,
    sigma=sigma,
    theta0=theta0,
    T=T,
    n_steps=n_steps,
    return_parameters=True
)

结果分析与可视化

我们将模拟得到的相位随时间变化图和系统同步性曲线画出来:

import matplotlib.pyplot as plt

fig, axs = plt.subplots(2, 1, figsize=(8, 7))
axs[0].plot(np.linspace(0, T, n_steps), np.sin(np.transpose(theta)))
axs[1].plot(np.linspace(0, T, n_steps), r)
axs[1].set_ylim((0, 1))
plt.tight_layout()
plt.show()

在这里插入图片描述

解锁高阶关系:我们如何用超图建模更复杂的网络交互?

什么是超图?

超图是对传统图的一种推广。在超图中,一条“边”(准确说是超边)可以连接两个以上的节点。我们可以把它看作是一个集合的集合:

  • 节点集合:V = {v0, v1, ..., vn-1}
  • 超边集合:E = {e0, e1, ..., em-1},每个超边 ei 是若干个节点的子集。

比如,一个 3-超边 [1, 2, 5] 表示节点 1、2 和 5 之间有某种三方互动关系。

特别说明:超边中不要求每两个节点都有边连接,这一点和单纯复形不同,后者强调“闭包性质”(有三角形就必须有边和点)。

基本概念回顾

我们快速看几个常用指标:

  • 超边度:一条超边包含多少个节点。
  • 节点度:某个节点被多少条超边覆盖(可以考虑超边权重加权)。
  • 超路径:从一个节点到另一个节点是否可以通过若干条超边跳转而达到。
举个栗子:神经元之间的超图建模

假设我们研究一个包含 6 个神经元的小网络,它们之间的交互关系如下:

  • 神经元 {1,2,5} 有群体活动,形成一个 2-超边(e1)
  • 神经元 {1,3} 直接交互,形成一个 1-超边(e2)
  • 神经元 {3,4,6} 也有协同,构成一个 2-超边(e3)

这个结构我们就可以用如下的关联矩阵(incidence matrix)表示:

     e1  e2  e3
v1   1   1   0
v2   1   0   0
v3   0   1   1
v4   0   0   1
v5   1   0   0
v6   0   0   1

如何将超图转为计算友好的矩阵形式?

我们可以从这个关联矩阵出发,进一步计算:

邻接矩阵 A

我们使用下面的公式进行转换:
A = H ⋅ W ⋅ D e − 1 ⋅ H T − I A = H \cdot W \cdot D_e^{-1} \cdot H^T - I A=HWDe1HTI

其中:

  • H H H:关联矩阵
  • W W W:超边权重矩阵(我们默认单位阵)
  • D e D_e De:超边度的对角矩阵(每条超边包含多少节点)
  • I I I:单位矩阵

这个邻接矩阵可以度量任意两个节点之间通过超边的“间接联系强度”。例如:

  • 节点 1 和节点 3 通过一条 1-超边连接, A 1 , 3 = 1 A1,3 = 1 A1,3=1
  • 节点 1 和节点 2 通过一条 3 节点的超边连接, A 1 , 2 = 0.5 A1,2= 0.5 A1,2=0.5(因为参与节点多,“稀释”了关系)
拉普拉斯矩阵 L

我们进一步可计算拉普拉斯矩阵
L = I − D v − 1 / 2 ⋅ A ⋅ D v − 1 / 2 L = I - D_v^{-1/2} \cdot A \cdot D_v^{-1/2} L=IDv1/2ADv1/2
这个矩阵是研究图或超图的核心工具之一,广泛用于社团发现、信号传播建模、图神经网络等任务。

从度数到重力:我们如何衡量超图中的“核心节点”?

在传统图论中,判断一个节点是否重要,我们可以看它的“连接数”是多少,或者它在网络中有多“靠中间”。这些思路没错,但到了超图这种更复杂、更真实的建模方法里,简单地数边数可能就不够了。

那么,我们该如何在**超图(Hypergraph)**中判断谁是“关键节点”呢?下面我们就来聊聊四种核心的中心性指标,带你从入门到“高阶重力”。


1.度中心性(Degree Centrality)

核心思想: 看一个节点连接了多少条超边。

在超图中,一条超边可以连接多个节点,所以一个节点只要参与了很多超边,那它一定在很多多方关系中活跃,说明它在网络中比较重要。

计算公式为:
D C ( v i ) = d ( v i ) n − 1 DC(v_i) = \frac{d(v_i)}{n - 1} DC(vi)=n1d(vi)
其中:

  • d ( v i ) d(v_i) d(vi):节点 v i v_i vi 所连接的超边数
  • n n n:网络中节点总数

归一化因子 n − 1 n-1 n1 是为了让中心性值在 0 到 1 之间,更方便跨网络比较。


2.介数中心性(Betweenness Centrality)

核心思想: 看一个节点是不是“中间人”。

如果很多节点之间传递信息时,必须“经过”某个节点,那这个节点就是信息流动的桥梁——也就是“中介”角色。

在超图中,我们也可以计算从任意两个节点出发的最短超路径,然后看有多少条这样的路径经过目标节点:
B C ( v i ) = ∑ j ≠ i ≠ k g j k ( i ) g j k BC(v_i) = \sum_{j \ne i \ne k} \frac{g_{jk}(i)}{g_{jk}} BC(vi)=j=i=kgjkgjk(i)
其中:

  • g j k g_{jk} gjk:节点 v j v_j vj v k v_k vk 的所有最短超路径数量
  • g j k ( i ) g_{jk}(i) gjk(i):这些路径中有多少条经过了节点 v i v_i vi

高介数节点非常适合用来监控、调度或切断信息流,适用于社交网络、交通网络、供应链等高依赖场景。

3. 接近中心性(Closeness Centrality)

核心思想: 看一个节点离其他节点有多“近”。

也就是说,从这个节点出发,能不能很快地“超边跳跃”到其他所有节点?

公式如下:
C C ( v i ) = n − 1 ∑ j ≠ i d i j CC(v_i) = \frac{n - 1}{\sum_{j \ne i} d_{ij}} CC(vi)=j=idijn1
其中 d i j d_{ij} dij 是从节点 v i v_i vi 到节点 v j v_j vj最短超路径长度

接近中心性高的节点在信息传播和广播中非常高效。


4.基于重力模型的中心性(HGC)

核心思想: 灵感来自牛顿引力公式,考虑节点之间的“引力”:节点连接越多(质量大)、距离越近(阻力小),吸引力就越强。

这个模型特别适合高阶交互系统,比如生物反应网络、群体行为网络等。

第一步:定义超边之间的距离
  • 如果两条超边 e i e_i ei e j e_j ej 共享至少 s s s个节点,就说它们是 s-相邻
  • 从一条超边到另一条超边的最短 “s-游走” 路径长度就是它们的 s-距离
第二步:定义节点之间的距离
  • 如果两个节点属于同一个超边,距离为 1;
  • 否则,通过其分别隶属的超边之间的 s-距离定义;
  • 不可达则设为 n + 1 n + 1 n+1(一种惩罚)。

最终,我们把不同 s 层级的距离叠加、加权:
d i j H = ∑ s = 1 m α s ⋅ d i j ( s ) d_{ij}^H = \sum_{s=1}^{m} \alpha^s \cdot d_{ij}^{(s)} dijH=s=1mαsdij(s)
其中 α \alpha α 是惩罚因子, d i j ( s ) d_{ij}^{(s)} dij(s)是节点 i i i j j j 在 s-级别下的距离。

第三步:计算 HGC 中心性

H G C ( v i ) = ∑ j ≠ i k j ( d i j H ) 2 HGC(v_i) = \sum_{j \ne i} \frac{k_j}{(d_{ij}^H)^2} HGC(vi)=j=i(dijH)2kj

节点的“质量”是它的度,距离越近吸引越强。这个指标兼顾了连接数和在高阶结构中的可达性,是最“物理直觉”的中心性模型之一。

从邮件看真相:我们用超图网络还原安然事件的沟通结构

2001 年,美国发生了一起震惊全球的企业丑闻 —— 安然事件。作为美国最大的能源公司之一,安然通过系统性造假操控财务数据,最终破产清算。事后调查显示,许多非法行为背后,都有内部高管通过电子邮件进行秘密沟通。

数据来源:xgi-data 中的安然邮件网络
import xgi
H_enron = xgi.load_xgi_data("email-enron")
print(f"该超图包括{H_enron.num_nodes}个节点和{H_enron.num_edges}条边")

在这里插入图片描述

也就是说,这个网络中有 148 个邮箱账户(节点),他们之间有超过 1 万次邮件互动(超边)

提取数据集格式如下:
在这里插入图片描述

第一步:清洗和可视化网络

我们想要看到“真实”的沟通图谱,需要去掉没有任何联系的孤立邮箱和重复的邮件记录。

# 检查是否连通
print(xgi.is_connected(H_enron))  # False

# 清洗超图
H_enron_cleaned = H_enron.cleanup(multiedges=False, singletons=False, isolates=False, relabel=True, in_place=False)

# 再次检查连通性
print(xgi.is_connected(H_enron_cleaned))  # True

在这里插入图片描述

清洗后的网络完全连通,更适合分析其结构特征。

接下来,用 xgi.draw() 将超图可视化,节点大小和颜色都按其度(活跃程度)设置:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8,10))
xgi.draw(
    H_enron_cleaned,
    node_size=H_enron_cleaned.nodes.degree,
    node_lw=H_enron_cleaned.nodes.average_neighbor_degree,
    node_fc=H_enron_cleaned.nodes.degree,
    ax=ax
)
plt.savefig("H_enron_cleaned.svg", format='svg')
plt.show()

在这里插入图片描述

你会看到一些“大节点”出现在网络核心——它们可能就是公司的沟通中心、也可能是邮件泄密的关键点。


第二步:从“度”出发看网络结构

在这里插入图片描述
在这里插入图片描述

1. 超边度分布

超边的度,指的是一封邮件涉及了多少人。我们统计并画出它的分布图:

list_of_edges_sizes = H_enron_cleaned.edges.size.aslist()
plt.hist(list_of_edges_sizes, bins=range(min(list_of_edges_sizes), max(list_of_edges_sizes)+1))
plt.xlabel("超边的度(每封邮件涉及人数)")
plt.ylabel("频数")
plt.title("安然邮件中每封邮件涉及人数分布")

通常我们会看到:大多数邮件只有 2~3 人参与,但也有少量群发邮件,可能是公司通报、公关声明等。


2. 节点度分布

节点的度,表示一个人参与了多少封邮件:

list_of_nodes_degrees = H_enron_cleaned.nodes.degree.aslist()
plt.hist(list_of_nodes_degrees, bins=range(min(list_of_nodes_degrees), max(list_of_nodes_degrees)+1))
plt.xlabel("节点的度(邮箱参与的邮件数)")
plt.ylabel("频数")
plt.title("安然员工的邮件活跃度分布")

你会发现,大多数员工只参与少量邮件,但也有极少数人是“邮件大户”——这些人,很可能是项目协调人、高管秘书,甚至就是调查中的嫌疑对象。

模体高阶网络的表示与分析:数据格式全解析

在研究复杂网络结构时,我们往往不仅关注节点和边的连接情况,更希望深入探索其中反复出现的局部连接模式。这些模式在网络中被称为“模体”(Motif)。通过对模体的识别和分析,我们能够捕捉更深层的功能结构和组织规律。那么,模体网络到底是怎么表示的?数据该如何组织?下面就带大家逐步梳理模体高阶网络的表示方法与数据格式

什么是模体?

模体,简单来说,就是网络中常见的小型连接结构,比如:

  • 三角形(三个节点两两相连)
  • 前馈环(典型于生物调控网络)
  • 二跳路径(在交通和信息传播中尤为常见)

这些小结构以高频的方式出现在特定类型网络中,意味着它们很可能承载了某种结构功能。

我们可以用一个元组 ( V , B ) (V, B) (V,B) 来描述一个模体:

  • V V V:模体中包含的节点集合
  • B B B:模体中节点之间的连接关系,用邻接矩阵表示
模体邻接矩阵怎么表示?

和传统网络的邻接矩阵类似,我们也可以用邻接矩阵 A M A_M AM 来表示模体网络中节点之间的模体连接关系:

import numpy as np

# 示例:基于三阶模体M7构建的邻接矩阵
A_M = np.array([
    [0,1,1,1,0,0,0,0,0,0],
    [1,0,1,1,0,0,0,0,0,0],
    [1,1,0,1,0,0,0,0,0,0],
    [1,1,1,0,0,0,0,0,0,0],
    [0,0,0,0,0,1,1,1,0,0],
    [0,0,0,0,1,0,1,1,0,0],
    [0,0,0,0,1,1,0,1,0,0],
    [0,0,0,0,1,1,1,0,1,1],
    [0,0,0,0,0,0,0,1,0,1],
    [0,0,0,0,0,0,0,1,1,0],
])

在上面的矩阵中,如果节点 i i i 和节点 j j j 共同参与某个模体 M 7 ( 3 ) M_7^{(3)} M7(3),我们就令 A i j = 1 A_{ij}=1 Aij=1,否则为 0。

模体加权邻接矩阵

除了“是否共现”,我们还可以统计模体共现的频率,构建加权邻接矩阵 W M W_M WM

# 假设某些模体共现多次,我们用频率计数
W_M = np.array([
    [0,3,3,3,0,0,0,0,0,0],
    [3,0,3,3,0,0,0,0,0,0],
    [3,3,0,3,0,0,0,0,0,0],
    [3,3,3,0,0,0,0,0,0,0],
    # 以下略……
])

这在大规模社交网络或生物网络中非常常见:频繁共现说明强耦合关系

节点-模体关联矩阵

有时我们也需要知道某个节点出现在哪些模体中,于是我们引入“节点-模体关联矩阵” AAA,它的形状是 n×mn \times mn×m:

python复制编辑A = np.array([
    [1, 1, 1, 0, 0, 0],  # 节点1参与前3个模体
    [1, 1, 1, 1, 0, 0],  # 节点2参与4个模体
    [1, 0, 0, 0, 0, 0],  # 节点3参与1个模体
    # 以下略……
])

通过这个矩阵,我们可以进一步计算节点的重要性、模体的分布等指标。

模体权重和频率加权矩阵

模体的作用并不等同。有些模体可能只是偶然出现,有些却结构性地频繁重复。我们可以根据模体出现次数 c j c_j cj,计算模体的权重 w j w_j wj

cj = np.array([3, 2, 1, 3, 2, 1])  # 各模体的出现次数
total = np.sum(cj)
wj = cj / total  # 得到权重

再将权重乘到原始关联矩阵 A 上,得到频率加权的 B 矩阵:

B = A * wj  # numpy 广播处理
模体中心性指标:NIO 分数

为了评价每个节点的“影响力”或“重要程度”,我们可以进一步使用**主成分分析(PCA)**对加权矩阵 BBB 做特征提取,定义节点的中心性得分:

# 协方差矩阵 + 最大特征值对应特征向量
C = np.cov(B.T)
eigvals, eigvecs = np.linalg.eig(C)
v = eigvecs[:, np.argmax(eigvals)]

# 计算节点中心性得分
score = B @ v

这样我们就得到了每个节点基于模体结构的影响力指标,适合用于识别关键用户、关键蛋白、或者传播核心节点。

模体挖掘实战:探究小鼠视觉皮层中的神经连接模式

近年来,随着神经连接组学的发展,我们可以在更精细的尺度上解析大脑结构。特别是在小鼠视觉皮层中,神经元之间的微观连接模式隐藏着信息传递的重要机制。我们将使用 Python 的 dotmotif 库,通过模体搜索方法,深入挖掘小鼠视觉皮层中高频三阶模体,探索脑神经网络的结构规律。

在神经网络中,信息的传递不仅是“点对点”的简单传输,很多时候它是遵循某些固定的连接模式进行的。这些反复出现的局部结构模式,就是所谓的网络模体(motif)

模体挖掘可以帮助我们:

  • 降维复杂的神经连接数据
  • 识别关键的信息通路
  • 揭示网络中功能性微回路

在小鼠视觉皮层中,不同的三阶模体(例如三角形、扇出结构等)可能意味着不同的信息处理方式。

数据准备:来自 MICrONS 项目的连接组数据

书中的本案例使用的是来自 MICrONS(Machine Intelligence from Cortical Networks) 项目的真实数据。数据来源于小鼠视觉皮层的连接图谱,格式为边列表(CSV),其中:

  • 每一行记录一次突触连接(前神经元 -> 后神经元)
  • 包含共 334 个神经元节点1736 条突触连接
操作流程
加载数据并构建图对象
from dotmotif.ingest import CSVEdgelistConverter

# CSV 文件路径(每行:pre_root_id, post_root_id)
CSV_EDGELIST = "soma_subgraph_synapses_spines_v185.csv"

# 构建图对象
graph = CSVEdgelistConverter(
    CSV_EDGELIST, "pre_root_id", "post_root_id"
).to_graph()
定义模体搜索引擎并指定结构

我们以搜索最基础的 三角形模体 M1(3) 为例:

from dotmotif import Motif, GrandIsoExecutor

E = GrandIsoExecutor(graph=graph)  # 搜索引擎

# 定义三角形模体 A → B → C → A
motif1 = Motif("""
    A -> B
    B -> C
    C -> A
""")

# 执行搜索
results1 = E.find(motif1)
print('指定模体在网络中的出现次数为:', len(results1))

输出结果:


搜索所有 13 种三阶模体,并统计频数

你可以通过循环方式定义其余 12 种模体,记录每种模体的出现次数,并保存至 Excel 表格:

import pandas as pd

motif_types = ['M1', 'M2', ..., 'M13']  # 示例名称
motif_patterns = ['A->B; B->C; C->A', ...]  # 具体结构

results = []
for name, pattern in zip(motif_types, motif_patterns):
    motif = Motif(pattern)
    count = len(E.find(motif))
    results.append({'模体类型': name, '次数': count})

# 保存为 Excel 文件
df = pd.DataFrame(results)
df.to_excel('模体统计数据.xlsx', index=False)

可视化:模体频次条形图
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_excel('模体统计数据.xlsx')

plt.figure(figsize=(14,6))
sns.barplot(x='模体类型', y='次数', data=df)
plt.ylabel("出现次数")
plt.title("小鼠视觉皮层中三阶模体的出现频次")
plt.savefig('模体统计图.svg', format='svg')
plt.show()

结果解读:三阶模体频率揭示的信息流模式

下图展示的是小鼠视觉皮层中 13 种三阶模体 的统计分布:

观察重点:

  • 最常见的是“扇出结构”(如 A → B, A → C),表明单个神经元通常连接多个下游目标
  • 很多闭环结构(如三角形模体)频率较低
  • 这说明该网络存在强烈的“前馈”特征:信息从输入神经元流向输出,而非在网络中循环

results = []
for name, pattern in zip(motif_types, motif_patterns):
motif = Motif(pattern)
count = len(E.find(motif))
results.append({‘模体类型’: name, ‘次数’: count})

保存为 Excel 文件

df = pd.DataFrame(results)
df.to_excel(‘模体统计数据.xlsx’, index=False)


------

##### 可视化:模体频次条形图

```python
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_excel('模体统计数据.xlsx')

plt.figure(figsize=(14,6))
sns.barplot(x='模体类型', y='次数', data=df)
plt.ylabel("出现次数")
plt.title("小鼠视觉皮层中三阶模体的出现频次")
plt.savefig('模体统计图.svg', format='svg')
plt.show()

结果解读:三阶模体频率揭示的信息流模式

下图展示的是小鼠视觉皮层中 13 种三阶模体 的统计分布:

观察重点:

  • 最常见的是“扇出结构”(如 A → B, A → C),表明单个神经元通常连接多个下游目标
  • 很多闭环结构(如三角形模体)频率较低
  • 这说明该网络存在强烈的“前馈”特征:信息从输入神经元流向输出,而非在网络中循环

这符合大脑中视觉信号处理的层级传递特点。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐