生物医学网络科学Biomedical Network Science
Example04 / 11

二分网络的投影——药物–靶点到药物–药物

所属专题
复杂系统与网络的数学表示
下载
Notebook · .py

一个虚构的药物–靶点二分网络(药物 D1–D5,靶点 T1–T6)。 投影到药物一侧:两种药物共享靶点就连边,边权 = 共享靶点数(等价于 B B^T 的非对角元)。 输出按共享靶点数从大到小列出药物对,并画出投影网络(边宽 ∝ 共享靶点数)。 共享靶点多的药物对是药物重定位的候选线索之一;矩阵计算与 NetworkX 的结果一致。

Output输出图

二分网络的投影——药物–靶点到药物–药物:输出图 1

Output文字输出

是二分图吗? True
D1 - D3 共享靶点数 = 2
D4 - D5 共享靶点数 = 2
D1 - D2 共享靶点数 = 1
D2 - D3 共享靶点数 = 1
B B^T(对角元为各药物的靶点数):
[[2 1 2 0 0]
 [1 2 1 0 0]
 [2 1 3 0 0]
 [0 0 0 2 2]
 [0 0 0 2 2]]

Code代码

# 一个虚构的药物–靶点二分网络(药物 D1–D5,靶点 T1–T6)。
# 投影到药物一侧:两种药物共享靶点就连边,边权 = 共享靶点数(等价于 B B^T 的非对角元)。
# 输出按共享靶点数从大到小列出药物对,并画出投影网络(边宽 ∝ 共享靶点数)。
# 共享靶点多的药物对是药物重定位的候选线索之一;矩阵计算与 NetworkX 的结果一致。
import networkx as nx
import numpy as np
from networkx.algorithms import bipartite
import matplotlib.pyplot as plt

drug_target = [("D1", "T1"), ("D1", "T2"), ("D2", "T2"), ("D2", "T3"), ("D3", "T1"),
               ("D3", "T2"), ("D3", "T4"), ("D4", "T5"), ("D5", "T5"), ("D5", "T6"), ("D4", "T6")]
drugs = sorted({d for d, _ in drug_target})
targets = sorted({t for _, t in drug_target})
B = nx.Graph()
B.add_nodes_from(drugs, bipartite=0)
B.add_nodes_from(targets, bipartite=1)
B.add_edges_from(drug_target)
print("是二分图吗?", bipartite.is_bipartite(B))

P = bipartite.weighted_projected_graph(B, drugs)
for u, v, w in sorted(P.edges(data="weight"), key=lambda x: -x[2]):
    print("%s - %s 共享靶点数 = %d" % (u, v, w))

# 用关联矩阵核对:P = B B^T
Bmat = bipartite.biadjacency_matrix(B, row_order=drugs, column_order=targets).toarray()
PP = Bmat @ Bmat.T
print("B B^T(对角元为各药物的靶点数):")
print(PP)

pos = nx.spring_layout(P, seed=0)
widths = [2 * w for _, _, w in P.edges(data="weight")]
nx.draw(P, pos, with_labels=True, width=widths, node_color="#9ecae1")
plt.title("drug projection (edge width = shared targets)")
plt.show()

Run在浏览器中运行

首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。

二分网络的投影——药物–靶点到药物–药物