跳转到内容

相似性网络融合(SNF)

快速概览

SNF 通过为每组学构建样本相似性网络,然后迭代融合这些网络,实现多组学数据的整合,不依赖于数据分布假设。

  • 核心是将数据转化为网络表示,通过消息传递实现融合
  • 不假设数据分布,适合不同类型的数据
  • 算法简单直观,是理解图方法多组学整合的入门算法

相似性网络融合(Similarity Network Fusion, SNF) 是一种基于图的多组学整合方法,通过构建和融合样本相似性网络实现多组学数据的联合分析。

输入

  • KK 个组学数据矩阵:X(1),X(2),...,X(K)X^{(1)}, X^{(2)}, ..., X^{(K)}
  • 其中 X(k)Rn×pkX^{(k)} \in \mathbb{R}^{n \times p_k}nn 为样本数,pkp_k 为组学 kk 的特征数
  • 近邻参数 KK(构建相似性网络时使用)
  • 融合迭代次数 TT

输出

  • P(k)Rn×nP^{(k)} \in \mathbb{R}^{n \times n}:各组学的相似性网络
  • PfusedRn×nP_{\text{fused}} \in \mathbb{R}^{n \times n}:融合后的相似性网络
  • 可用于下游聚类、可视化、分类等任务

SNF 的核心思想包含三个步骤:

  1. 网络构建:为每组学数据构建样本相似性网络
  2. 网络融合:通过迭代消息传递融合多个网络
  3. 下游分析:融合后的网络用于聚类、可视化等

与传统方法(如 NMF、CCA)不同,SNF 不假设数据分布,而是将数据转化为图表示进行整合。

在生物信息学中,SNF 的价值体现在:

  • 无分布假设:不依赖数据分布,适合各种类型的数据
  • 直观性:网络表示易于理解和可视化
  • 灵活性:相似性度量可以自定义
  • 鲁棒性:对噪声和异常值相对鲁棒
  • 可扩展性:可以轻松添加新的组学数据

虽然深度学习方法在灵活性上更强,但 SNF 仍然是理解基于网络的多组学整合的重要基础。

对于一组学数据 XRn×pX \in \mathbb{R}^{n \times p},构建样本相似性网络:

  • 节点nn 个样本
  • :样本间的相似度
  • 权重:相似性度量的值

如果不同组学测量的是同一个生物学系统,那么它们应该在相似性网络上呈现一致的模式。

SNF 通过迭代融合,让每个网络”吸收”其他网络的信息,最终得到一个融合网络。

对于样本 iijj,常用的相似性度量包括:

欧氏距离

d{ij}=xixj2d_\{ij\} = \|x_i - x_j\|_2

热核相似度

W{ij}=exp(d{ij}2/μϵi)W_\{ij\} = \exp(-d_\{ij\}^2 / \mu \epsilon_i)

其中:

  • μ\mu 是超参数
  • ϵi\epsilon_i 是局部缩放参数,通常设为样本 ii 到其第 kk 个近邻的距离

构建相似性网络后,需要归一化:

行归一化

P{ij}={W{ij}}{{l=1}{n}W{il}}P_\{ij\} = \frac\{W_\{ij\}\}\{\sum_\{l=1\}^\{n\} W_\{il\}\}

这使每行和为 1,形成随机矩阵。

对于 KK 个组学,有 KK 个相似性网络 P(1),P(2),...,P(K)P^{(1)}, P^{(2)}, ..., P^{(K)}

融合迭代:

P{(k)}S{(k)}×({{lk}P{(l)}}{K1})×(S{(k)})TP^\{(k)\} \leftarrow S^\{(k)\} \times \left(\frac\{\sum_\{l \neq k\} P^\{(l)\}\}\{K-1\}\right) \times (S^\{(k)\})^T

其中 S(k)S^{(k)}P(k)P^{(k)} 的对称版本:

S{(k)}={(P{(k)})T+P{(k)}}{2}S^\{(k)\} = \frac\{(P^\{(k)\})^T + P^\{(k)\}\}\{2\}
相似性网络 $P^{(k)}$
组学 k 的样本相似性矩阵,P_{ij} 表示样本 i 和 j 的相似度。
消息传递
通过矩阵乘法实现,每个节点从邻居接收信息并传递给其他节点。
融合网络 $P$
迭代收敛后的网络,整合了所有组学的相似性信息。

算法1:构建相似性网络

输入:组学矩阵 X ∈ R^\{n×p\},近邻数 K
输出:相似性网络 P
1. 计算距离矩阵:
for i = 1 to n:
for j = 1 to n:
d_\{ij\} = ||x_i - x_j||_2
2. 计算局部缩放参数:
for i = 1 to n:
对 d_\{i,:\} 排序,取第 K 个近邻的距离
ε_i = d_\{i,(K)\}
3. 计算相似性矩阵:
for i = 1 to n:
for j = 1 to n:
W_\{ij\} = exp(-d_\{ij\}^2 / (μ × ε_i × ε_j))
4. 归一化:
for i = 1 to n:
P_\{ij\} = W_\{ij\} / sum_l W_\{il\}
5. return P

时间复杂度O(n2p+n2logn)O(n^2 p + n^2 \log n)

算法2:对称化相似性网络

输入:相似性网络 P
输出:对称网络 S
1. S = (P^T + P) / 2
2. return S

算法3:SNF 网络融合

输入:K个相似性网络 P^\{(1)\}, ..., P^\{(K)\},最大迭代次数 T
输出:融合网络 P
1. 对每个组学 k:
a. 计算对称版本:S^\{(k)\} = (P^\{(k)\})^T + P^\{(k)\}) / 2
b. 初始化:P^\{(k)\}_0 = P^\{(k)\}
2. for iteration = 1 to T:
对每个组学 k:
a. 计算其他网络的平均:
P_avg = (∑_\{l ≠ k\} P^\{(l)\}_\{iteration-1\}) / (K-1)
b. 更新网络:
P^\{(k)\}_\{iteration\} = S^\{(k)\} × P_avg × (S^\{(k)\})^T
c. 归一化:
P^\{(k)\}_\{iteration\} = 归一化(P^\{(k)\}_\{iteration\})
3. 计算融合网络:
P = (∑_\{k=1\}^\{K\} P^\{(k)\}_T) / K
4. return P

时间复杂度:每次迭代 O(Kn3)O(K n^3),总复杂度 O(TKn3)O(T K n^3)

算法4:谱聚类

输入:融合网络 P,聚类数 K_cluster
输出:聚类标签
1. 计算度矩阵:
D_\{ii\} = ∑_j P_\{ij\}
2. 计算拉普拉斯矩阵:
L = D - P
3. 计算 L 的前 K_cluster 个特征向量
4. 对特征向量进行 k-means 聚类
5. return 聚类标签

考虑两个组学数据:

  • 基因表达:3 个样本,4 个基因
  • 甲基化:3 个样本,3 个位点
X^\{(1)\} = \begin\{bmatrix\} 5 & 3 & 0 & 0 \\ 4 & 2 & 0 & 0 \\ 0 & 0 & 4 & 5 \end\{bmatrix\}, \quad X^\{(2)\} = \begin\{bmatrix\} 3 & 0 & 0 \\ 2 & 0 & 0 \\ 0 & 4 & 3 \end\{bmatrix\}

组学 1(基因表达)

计算欧氏距离矩阵:

D^\{(1)\} = \begin\{bmatrix\} 0 & 2.24 & 9.22 \\ 2.24 & 0 & 8.06 \\ 9.22 & 8.06 & 0 \end\{bmatrix\}

假设 μ=0.5\mu = 0.5K=1K = 1ϵ=[2.24,2.24,8.06]\epsilon = [2.24, 2.24, 8.06]

计算相似性矩阵(简化):

W^\{(1)\} = \begin\{bmatrix\} 1 & 0.37 & 0 \\ 0.37 & 1 & 0.01 \\ 0 & 0.01 & 1 \end\{bmatrix\}

归一化后:

P^\{(1)\} = \begin\{bmatrix\} 0.73 & 0.27 & 0 \\ 0.27 & 0.72 & 0.01 \\ 0 & 0.01 & 0.99 \end\{bmatrix\}

组学 2(甲基化)

类似计算得到:

P^\{(2)\} = \begin\{bmatrix\} 0.75 & 0.25 & 0 \\ 0.25 & 0.75 & 0 \\ 0 & 0 & 1 \end\{bmatrix\} S^\{(1)\} = \begin\{bmatrix\} 0.73 & 0.27 & 0 \\ 0.27 & 0.72 & 0.005 \\ 0 & 0.005 & 0.99 \end\{bmatrix\}, \quad S^\{(2)\} = \begin\{bmatrix\} 0.75 & 0.25 & 0 \\ 0.25 & 0.75 & 0 \\ 0 & 0 & 1 \end\{bmatrix\}

步骤 3:迭代融合(第一次迭代)

Section titled “步骤 3:迭代融合(第一次迭代)”

更新 P^{(1)}

计算其他网络平均:

P_\{avg\} = P^\{(2)\} = \begin\{bmatrix\} 0.75 & 0.25 & 0 \\ 0.25 & 0.75 & 0 \\ 0 & 0 & 1 \end\{bmatrix\}

更新:

P{(1)}1=S{(1)}×P{avg}×(S{(1)})TP^\{(1)\}_1 = S^\{(1)\} \times P_\{avg\} \times (S^\{(1)\})^T

(具体矩阵乘法省略)

更新 P^{(2)}

类似地更新 P(2)P^{(2)}

经过多次迭代后,假设收敛到:

P_\{fused\} = \begin\{bmatrix\} 0.70 & 0.30 & 0 \\ 0.30 & 0.70 & 0 \\ 0 & 0 & 1 \end\{bmatrix\}

解释:

  • 样本 1 和 2 相似度高(0.30)
  • 样本 3 与其他样本相似度低
  • 这表明样本 1 和 2 可能属于同一类,样本 3 属于另一类
  • 构建相似性网络:O(Kn2p+Kn2logn)O(K n^2 p + K n^2 \log n)
  • 网络融合:O(TKn3)O(T K n^3)
  • 谱聚类:O(n3)O(n^3)
  • 总计:O(TKn3)O(T K n^3)

nn 较大时,计算开销显著。

  • 存储相似性网络:O(Kn2)O(K n^2)
  • 存储融合网络:O(n2)O(n^2)
  • 总计:O(Kn2)O(K n^2)
  • 经验值:通常 K[5,20]K \in [5, 20]
  • 数据规模:样本多时可以增大 K
  • 局部性:K 控制相似性的局部程度
  • 经验值:通常 μ[0.3,0.7]\mu \in [0.3, 0.7]
  • 作用:控制相似性的衰减速度
  • 调参:可以通过下游任务性能调优
  • 经验值:通常 T[10,50]T \in [10, 50]
  • 收敛判断:监控网络变化,当变化小于阈值时停止

对不同组学赋予不同权重:

P{avg}={{lk}wlP{(l)}}{{lk}wl}P_\{avg\} = \frac\{\sum_\{l \neq k\} w_l P^\{(l)\}\}\{\sum_\{l \neq k\} w_l\}

支持增量添加新样本或新组学。

使用深度学习学习相似性度量,再进行网络融合。

  • 样本量中等(n < 5000)
  • 数据类型多样
  • 不依赖分布假设
  • 需要网络表示
  • 相似性度量易定义
  • 大规模数据(n > 10000,计算开销大)
  • 需要处理缺失数据
  • 需要不确定性估计
  • 需要特征层面的整合(SNF 是样本层面)
方法整合层面分布假设缺失数据计算效率可解释性
SNF样本
Joint NMF特征非负
CCA特征高斯
MOFA+特征高斯
Deep Learning特征
import numpy as np
from sklearn.metrics.pairwise import euclidean_distances
from sklearn.cluster import SpectralClustering
def construct_similarity_network(X, K=10, mu=0.5):
"""
构建相似性网络
参数:
X: 数据矩阵(n_samples, n_features)
K: 近邻数
mu: 超参数
返回:
P: 相似性网络
"""
n = X.shape[0]
# 计算欧氏距离
D = euclidean_distances(X)
# 计算局部缩放参数
epsilon = np.sort(D, axis=1)[:, K]
# 计算相似性矩阵
W = np.zeros((n, n))
for i in range(n):
for j in range(n):
W[i, j] = np.exp(-D[i, j]**2 / (mu * epsilon[i] * epsilon[j]))
# 归一化
P = W / W.sum(axis=1, keepdims=True)
return P
def snf(P_list, T=20, K=20):
"""
相似性网络融合
参数:
P_list: 相似性网络列表
T: 迭代次数
K: 近邻数(用于消息传递)
返回:
P_fused: 融合网络
"""
K_omics = len(P_list)
n = P_list[0].shape[0]
# 对称化网络
S_list = [(P.T + P) / 2 for P in P_list]
# 迭代融合
P_current = P_list.copy()
for t in range(T):
P_next = []
for k in range(K_omics):
# 计算其他网络的平均
P_avg = np.mean([P_current[l] for l in range(K_omics) if l != k], axis=0)
# 消息传递
P_k = S_list[k] @ P_avg @ S_list[k].T
# 归一化
P_k = P_k / P_k.sum(axis=1, keepdims=True)
P_next.append(P_k)
P_current = P_next
# 融合所有网络
P_fused = np.mean(P_current, axis=0)
return P_fused
# 使用示例
X1 = np.random.randn(100, 50) # 基因表达
X2 = np.random.randn(100, 30) # 甲基化
# 构建相似性网络
P1 = construct_similarity_network(X1, K=10)
P2 = construct_similarity_network(X2, K=10)
# 融合网络
P_fused = snf([P1, P2], T=20)
# 谱聚类
clustering = SpectralClustering(n_clusters=3, affinity='precomputed')
labels = clustering.fit_predict(P_fused)
print(f"聚类标签: \{labels\}")
# 使用 SNFtool 包
library(SNFtool)
# 假设 data1 和 data2 是数据矩阵
dist1 <- as.matrix(dist(data1))
dist2 <- as.matrix(dist(data2))
# 构建相似性网络
W1 <- affinityMatrix(dist1, K = 20, sigma = 0.5)
W2 <- affinityMatrix(dist2, K = 20, sigma = 0.5)
# 融合网络
W <- SNF(list(W1, W2), K = 20, t = 20)
# 谱聚类
labels <- spectralClustering(W, K = 3)
所属板块 分析方向与案例

把基础对象与算法方法重新放回真实分析任务与工作流。

阅读目标 帮助建立阅读上下文

先判断这页与你当前问题的关系,再决定是否深入展开。

建议前置 先建立相关基础对象与方法直觉

建议先建立相关基础对象与方法直觉,再进入本页。

对于大规模数据:

  • 使用近似最近邻(如 ANN)
  • 稀疏化相似性网络
  • 使用 Landmark 方法
  • 不同组学的网络构建可以并行
  • 网络融合中的矩阵乘法可以并行
  • 当添加新样本时,可以增量更新网络
  • 避免重新计算整个网络
  • Wang, B., et al. (2014). “Similarity network fusion for aggregating data types on a genomic scale”. Nature methods, 11(3), 333-337.
  • Wang, B., & A. J. (2018). “Similarity Network Fusion: A Fast and Effective Method for Integrating Multi-Omics Data”