3. 基础知识:网络科学基础——节点、边、度、中心性、社区等概念
各位同学,我们正式进入网络科学的地盘。
老实说,我第一次接触网络分析是看一篇蛋白互作网络的文章。当时想:这不就是画几个圈、连几条线吗?后来深入进去才发现,这里面的学问比我想象的深得多。
你想想看,一个药物分子在人体里怎么起作用?它得找到靶点蛋白,然后影响下游一堆蛋白,最后才产生药效。这一连串关系,本质上就是一个网络。
这节课,我们把网络科学的核心概念过一遍。这些东西不搞懂,后面分析药物-靶点网络就是个门外汉。
3.1 网络的基本构成:节点与边
任何一个网络,拆到最简,就两样东西:节点和边。
- 节点(Node / Vertex):网络中的个体。在药物-靶点网络中,节点可以是药物、靶点蛋白、基因、疾病等。
- 边(Edge / Link):节点之间的关系。比如药物和靶点之间的「结合」关系,蛋白与蛋白之间的「相互作用」关系。
我这里有个习惯,拿到一个网络数据集后,第一件事就是数清楚这两样:多少个节点?多少条边?这决定了网络的规模和密度。
小提示:在生物信息学里,节点个数通常用 N 表示,边数用 E 表示。网络密度(Density)用公式 2E / (N(N-1)) 计算。这个数字越接近 1,说明网络越稠密;越接近 0,越稀疏。
举个我实际遇到的例子。有一回分析一个激酶-抑制剂网络,2000 多个节点,但边的数量只有 1500 条。算下来密度不到 0.001。这说明什么?大多数节点之间没有直接联系,网络非常稀疏。这在生物网络中很常见——真正有意义的相互作用往往是少数。
3.2 边是有方向的吗?——有向图与无向图
网络分为两大类,这点要分清楚:
| 类型 | 含义 | 药物-靶点网络例子 |
|---|---|---|
| 无向图 | 边没有方向,关系对称 | 蛋白-蛋白相互作用(PPI),A和B相互结合 |
| 有向图 | 边有方向,关系不对称 | 药物→靶点(药物作用于靶点),或信号通路中的A→B(A激活B) |
我个人习惯,在做药物-靶点分析时,一般先用无向图做全局概览。为什么?因为很多数据库提供的药物-靶点关系默认是双向的——药物结合了靶点,靶点被药物作用了。但如果你做的是信号通路分析,就必须用有向图,因为激活和抑制的方向是明确的。
注意:处理有向图时,千万别忘了方向。我曾经漏掉了边的方向,把一个抑制关系当成激活来分析,结果下游分析全错了。花了三天才排查出来。
3.3 一个核心指标:度
度(Degree)是最简单、最常用的节点重要性指标。
- 度:一个节点连接的边的数目。
- 在无向图中,度就是邻居个数。
- 在有向图中,分为入度(指向该节点的边数)和出度(从该节点出发的边数)。
我们在生物网络中,经常用度的分布来区分节点类型。比如一个药物有 50 个靶点,那它的度就是 50。这种高节点叫做「枢纽节点」(Hub),在药物网络中往往对应多靶点药物或广谱药物。
度分布还有一个有趣的性质:生物网络的度分布往往服从幂律分布。说白了,就是大多数节点度很小,只有少数节点度非常大。我刚开始做网络分析时,看到这种分布图总觉得不对劲,后来才明白——这在生物系统中是常态。
3.4 谁更重要?——中心性
度只能告诉我们谁的朋友多,但朋友多不等于重要。中心性(Centrality)是用来衡量节点在「结构上」到底有多关键。
这里我归纳了四种常用的中心性指标:
| 中心性类型 | 核心思想 | 生物信息学应用场景 |
|---|---|---|
| 度中心性 | 邻居数越多越重要 | 识别多靶点药物、Hub蛋白 |
| 介数中心性 | 节点出现在多少条最短路径上 | 识别关键通路调控节点、药物作用瓶颈 |
| 紧密中心性 | 节点到其他节点的平均距离越短越重要 | 寻找信息传播最快的节点 |
| 特征向量中心性 | 邻居越重要,自己越重要 | PageRank类算法,常用于基因优先级排序 |
我的经验:做药物-靶点网络时,介数中心性往往比度中心性更有参考价值。为什么?一个节点度虽高,但如果只是和很多不重要的节点连接,它对网络的控制力其实不强。而介数中心性能抓到那些「一夫当关」的关键节点——这些节点一旦被药物干扰,整个网络反应会非常大。
3.5 社团结构:网络中还有小圈子
网络不是铁板一块。你会发现节点会自发聚成一个个小团体,这就是社区结构(Community Structure)。
社区的定义其实很直观:社区内部的连接密集,社区之间的连接稀疏。这在药物-靶点网络中太常见了——同一个通路的蛋白往往聚成一个社区,相同适应证的药物也常常共享靶点。
检测社区的方法很多。我常用的有:
- 模块度优化(Louvain算法):速度快,适合大网络,默认推荐。
- 标签传播(LPA算法):简单高效,不需要预设社区数。
- 层次聚类:能看社区的层级结构,适合小网络。
举个例子,我之前分析一个药物-靶点网络时,用 Louvain 算法发现了 5 个社区。社区 1 全是 GPCR 靶点和相关药物,社区 2 全是激酶靶点和对应的靶向药物。这说明什么?生化分类在网络上自然呈现出来了。
避坑指南:社区检测不是越细越好。我曾经把模块度调到最大,结果分出 50 多个小社区,每个就 2-3 个节点。这种社区没有分析价值。我现在的做法:跑一次快速划分,先看大结构,再根据问题细化。
3.6 网络科学知识体系一览
为了让你快速建立整体视角,我画了一张结构图。它把刚才讲的核心概念串了起来。
3.7 怎么在 Python 里实操?——NetworkX 入门
光讲理论不上手,等于白学。我个人用的网络分析工具是 Python 的 NetworkX。它的 API 设计得很清爽,上手快。
下面是一个极简的例子,展示怎么创建网络、算度和介数中心性:
import networkx as nx
# 创建一个空的无向图
G = nx.Graph()
# 添加节点和边
G.add_nodes_from(['药物A', '药物B', '靶点1', '靶点2', '靶点3'])
G.add_edges_from([
('药物A', '靶点1'),
('药物A', '靶点2'),
('药物B', '靶点2'),
('药物B', '靶点3')
])
# 计算度
print('度:')
for node, deg in G.degree():
print(f' {node}: {deg}')
# 计算介数中心性
bc = nx.betweenness_centrality(G)
print('\n介数中心性:')
for node, val in bc.items():
print(f' {node}: {val:.3f}')
输出结果会告诉你哪个节点在网络中「地位」更高。我当年就是靠这种简单代码,一步步摸清楚药物-靶点网络的数据结构的。
注意:NetworkX 默认是内存计算。如果你的网络节点超过 10 万个,算介数中心性会非常慢。我建议先用度中心性做第一轮筛选,再对候选子集算介数中心性。别一上来就跑全量计算——我吃过这个亏,跑了 12 小时没出结果。
3.8 概念回顾
最后我快速过一遍,你打开这个文档时,应该能直接找到对应概念:
- 节点 + 边:网络的最小构成单位。
- 有向 vs 无向:决定你用什么方式建模。
- 度:最基本的中心性指标,快速定位 Hub。
- 介数/紧密/特征向量中心性:从不同角度评估节点重要性。
- 社区:网络中的模块,对应功能模块或信号通路。