Label Propagation算法:图半监督学习的核心方法

Label Propagation算法:图半监督学习的核心方法

算法原理与核心思想

Label Propagation(标签传播)是一种基于图结构的半监督学习算法,其核心思想是通过迭代传播标签信息,将少量标注样本的标签扩散到整个无标注数据集中。该算法假设相邻节点(数据点)具有相似的标签,通过构建图结构(如KNN图、全连接图)量化节点间的相似性,并利用相似性矩阵指导标签传播过程。

图结构构建

图的构建是算法的基础。每个数据点作为节点,节点间的边权重表示相似性。常见方法包括:

  • KNN图:每个节点仅连接到最近的K个节点,适合高维稀疏数据。
  • 全连接图:所有节点两两连接,权重通过高斯核函数计算((w_{ij} = e^{-\frac{||x_i - x_j||^2}{2\sigma^2}})),适合低维稠密数据。
  • ε-邻域图:仅当节点距离小于阈值ε时连接,控制图的稀疏性。

标签传播过程

算法通过迭代更新每个无标注节点的标签,步骤如下:

  1. 初始化:标注节点保留原始标签,无标注节点初始化为空或随机标签。
  2. 传播阶段:每个无标注节点根据邻居节点的标签和边权重更新自身标签。更新规则通常为加权投票:
    [
    yi^{(t+1)} = \arg\max{c} \sum{j \in N(i)} w{ij} \cdot \mathbb{I}(yj^{(t)} = c)
    ]
    其中(N(i))为节点i的邻居集合,(w
    {ij})为边权重,(\mathbb{I})为指示函数。
  3. 收敛条件:当标签变化小于阈值或达到最大迭代次数时停止。

实现步骤与代码示例

步骤1:构建相似性矩阵

以Python为例,使用NumPy和Scikit-learn构建KNN图:

  1. import numpy as np
  2. from sklearn.neighbors import kneighbors_graph
  3. def build_similarity_matrix(X, k=5):
  4. # 构建KNN图并转换为对称矩阵
  5. conn = kneighbors_graph(X, k, mode='connectivity', include_self=True)
  6. W = 0.5 * (conn + conn.T) # 确保对称性
  7. # 转换为稀疏矩阵(可选)
  8. from scipy.sparse import csr_matrix
  9. return csr_matrix(W)

步骤2:标签传播迭代

  1. def label_propagation(W, labels, max_iter=100, tol=1e-3):
  2. n_samples = W.shape[0]
  3. n_classes = len(np.unique(labels))
  4. unlabeled = labels == -1 # 假设-1表示无标注
  5. # 初始化概率矩阵(行:样本,列:类别)
  6. Y = np.zeros((n_samples, n_classes))
  7. labeled_idx = np.where(~unlabeled)[0]
  8. for i in labeled_idx:
  9. Y[i, labels[i]] = 1
  10. for _ in range(max_iter):
  11. Y_prev = Y.copy()
  12. # 传播:Y = D^{-1} * W * Y
  13. D = np.diag(np.array(W.sum(axis=1)).flatten())
  14. D_inv = np.linalg.inv(D)
  15. Y = D_inv @ W @ Y
  16. # 保持标注节点不变
  17. Y[labeled_idx] = np.eye(n_classes)[labels[labeled_idx]]
  18. # 检查收敛
  19. if np.linalg.norm(Y - Y_prev) < tol:
  20. break
  21. predicted_labels = np.argmax(Y, axis=1)
  22. return predicted_labels

优化策略与最佳实践

1. 相似性矩阵设计

  • 归一化:对边权重进行行归一化((D^{-1}W)),避免高权重节点主导传播。
  • 稀疏化:使用稀疏矩阵存储相似性矩阵,降低内存消耗。
  • 参数调优:调整KNN的K值或高斯核的σ参数,平衡局部与全局一致性。

2. 收敛加速

  • 提前终止:设置标签变化阈值(如tol=1e-3),避免无效迭代。
  • 并行计算:对大规模图,可使用图划分技术(如METIS)并行处理子图。

3. 处理类别不平衡

  • 加权传播:在传播阶段对少数类样本赋予更高权重。
  • 过采样:结合SMOTE等过采样方法增加少数类标注样本。

实际应用场景

1. 社交网络用户分类

在社交网络中,少量用户标注了兴趣标签(如体育、音乐),通过构建用户关系图,Label Propagation可预测其他用户的兴趣。

2. 图像分割

将像素作为节点,颜色相似性作为边权重,利用少量标注像素传播标签,实现图像语义分割。

3. 推荐系统

在用户-物品二分图中,标注部分用户偏好,通过传播预测其他用户的潜在兴趣。

注意事项与局限性

1. 图质量影响结果

  • 噪声边:错误连接的边会导致标签错误传播,需通过阈值或算法(如Jaccard相似性)过滤。
  • 图密度:过密的图会降低局部一致性,过稀的图会导致传播中断。

2. 标注数据分布

  • 标注偏差:若标注样本不能代表整体分布,传播结果会偏向标注区域。
  • 冷启动问题:极少量标注样本(如<1%)可能导致收敛困难。

3. 算法选择

  • Label Spreading:作为Label Propagation的变种,引入正则化项((Y = (I - \alpha S)^{-1} Y_0)),其中(S)为归一化相似性矩阵,(\alpha)控制平滑程度,适合噪声较多的数据。

性能优化思路

1. 近似最近邻(ANN)

对大规模数据,使用FAISS或HNSW等库加速KNN图构建,将时间复杂度从O(n²)降至O(n log n)。

2. 分布式计算

利用Spark GraphX或Dask等框架分布式构建图和传播标签,处理亿级节点数据。

3. 增量学习

当新数据到达时,仅更新受影响节点的标签,避免全图重新计算。

总结

Label Propagation算法通过图结构高效利用少量标注数据,在社交网络、图像处理等领域展现出强大能力。其实现需关注图构建质量、收敛条件及参数调优,结合优化策略(如稀疏化、并行化)可进一步提升性能。对于更复杂场景,可探索Label Spreading或结合深度学习的图神经网络(GNN)方法。