相似性网络融合(SNF)
SNF 通过为每组学构建样本相似性网络,然后迭代融合这些网络,实现多组学数据的整合,不依赖于数据分布假设。
- 核心是将数据转化为网络表示,通过消息传递实现融合
- 不假设数据分布,适合不同类型的数据
- 算法简单直观,是理解图方法多组学整合的入门算法
什么是相似性网络融合
Section titled “什么是相似性网络融合”相似性网络融合(Similarity Network Fusion, SNF) 是一种基于图的多组学整合方法,通过构建和融合样本相似性网络实现多组学数据的联合分析。
输入:
- 个组学数据矩阵:
- 其中 , 为样本数, 为组学 的特征数
- 近邻参数 (构建相似性网络时使用)
- 融合迭代次数
输出:
- :各组学的相似性网络
- :融合后的相似性网络
- 可用于下游聚类、可视化、分类等任务
SNF 的核心思想包含三个步骤:
- 网络构建:为每组学数据构建样本相似性网络
- 网络融合:通过迭代消息传递融合多个网络
- 下游分析:融合后的网络用于聚类、可视化等
与传统方法(如 NMF、CCA)不同,SNF 不假设数据分布,而是将数据转化为图表示进行整合。
在生物信息学中,SNF 的价值体现在:
- 无分布假设:不依赖数据分布,适合各种类型的数据
- 直观性:网络表示易于理解和可视化
- 灵活性:相似性度量可以自定义
- 鲁棒性:对噪声和异常值相对鲁棒
- 可扩展性:可以轻松添加新的组学数据
虽然深度学习方法在灵活性上更强,但 SNF 仍然是理解基于网络的多组学整合的重要基础。
对于一组学数据 ,构建样本相似性网络:
- 节点: 个样本
- 边:样本间的相似度
- 权重:相似性度量的值
SNF 的洞察
Section titled “SNF 的洞察”如果不同组学测量的是同一个生物学系统,那么它们应该在相似性网络上呈现一致的模式。
SNF 通过迭代融合,让每个网络”吸收”其他网络的信息,最终得到一个融合网络。
对于样本 和 ,常用的相似性度量包括:
欧氏距离:
热核相似度:
其中:
- 是超参数
- 是局部缩放参数,通常设为样本 到其第 个近邻的距离
相似性网络归一化
Section titled “相似性网络归一化”构建相似性网络后,需要归一化:
行归一化:
这使每行和为 1,形成随机矩阵。
对于 个组学,有 个相似性网络 。
融合迭代:
其中 是 的对称版本:
- 相似性网络 $P^{(k)}$
- 组学 k 的样本相似性矩阵,P_{ij} 表示样本 i 和 j 的相似度。
- 消息传递
- 通过矩阵乘法实现,每个节点从邻居接收信息并传递给其他节点。
- 融合网络 $P$
- 迭代收敛后的网络,整合了所有组学的相似性信息。
步骤 1:构建相似性网络
Section titled “步骤 1:构建相似性网络”算法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时间复杂度:
步骤 2:对称化网络
Section titled “步骤 2:对称化网络”算法2:对称化相似性网络
输入:相似性网络 P输出:对称网络 S
1. S = (P^T + P) / 2
2. return S步骤 3:迭代融合网络
Section titled “步骤 3:迭代融合网络”算法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时间复杂度:每次迭代 ,总复杂度
步骤 4:下游分析
Section titled “步骤 4:下游分析”算法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 个位点
步骤 1:构建相似性网络
Section titled “步骤 1:构建相似性网络”组学 1(基因表达):
计算欧氏距离矩阵:
D^\{(1)\} = \begin\{bmatrix\} 0 & 2.24 & 9.22 \\ 2.24 & 0 & 8.06 \\ 9.22 & 8.06 & 0 \end\{bmatrix\}假设 ,,。
计算相似性矩阵(简化):
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\}步骤 2:对称化网络
Section titled “步骤 2:对称化网络”步骤 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^{(2)}:
类似地更新 。
步骤 4:收敛后的融合网络
Section titled “步骤 4:收敛后的融合网络”经过多次迭代后,假设收敛到:
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 属于另一类
- 构建相似性网络:
- 网络融合:
- 谱聚类:
- 总计:
当 较大时,计算开销显著。
- 存储相似性网络:
- 存储融合网络:
- 总计:
- 经验值:通常
- 数据规模:样本多时可以增大 K
- 局部性:K 控制相似性的局部程度
- 经验值:通常
- 作用:控制相似性的衰减速度
- 调参:可以通过下游任务性能调优
迭代次数 T
Section titled “迭代次数 T”- 经验值:通常
- 收敛判断:监控网络变化,当变化小于阈值时停止
加权 SNF
Section titled “加权 SNF”对不同组学赋予不同权重:
在线 SNF
Section titled “在线 SNF”支持增量添加新样本或新组学。
深度 SNF
Section titled “深度 SNF”使用深度学习学习相似性度量,再进行网络融合。
适合使用 SNF 的情况
Section titled “适合使用 SNF 的情况”- 样本量中等(n < 5000)
- 数据类型多样
- 不依赖分布假设
- 需要网络表示
- 相似性度量易定义
不适合使用 SNF 的情况
Section titled “不适合使用 SNF 的情况”- 大规模数据(n > 10000,计算开销大)
- 需要处理缺失数据
- 需要不确定性估计
- 需要特征层面的整合(SNF 是样本层面)
与其他方法的比较
Section titled “与其他方法的比较”| 方法 | 整合层面 | 分布假设 | 缺失数据 | 计算效率 | 可解释性 |
|---|---|---|---|---|---|
| SNF | 样本 | 无 | 差 | 低 | 高 |
| Joint NMF | 特征 | 非负 | 差 | 高 | 高 |
| CCA | 特征 | 高斯 | 差 | 高 | 中 |
| MOFA+ | 特征 | 高斯 | 好 | 中 | 高 |
| Deep Learning | 特征 | 无 | 好 | 低 | 低 |
在真实工具中的实现
Section titled “在真实工具中的实现”Python 实现
Section titled “Python 实现”import numpy as npfrom sklearn.metrics.pairwise import euclidean_distancesfrom 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”