如何使用Label Propagation/Spreading算法完成带权重多标签数据集缺失标签预测
Label Spreading算法适配图节点标签预测的实现方法
核心适配逻辑
你参考的手写数字示例是基于样本原始特征计算相似度做标签传播,而你的场景是用户节点通过边权重关联的图结构传播场景,核心调整点如下:
- 先将所有用户节点映射为唯一索引ID
- 基于边的
Weight字段构造节点间的相似度邻接矩阵,权重越高代表两个节点相似度越高 - 调用Label Spreading时指定
kernel='precomputed',直接使用预计算的邻接矩阵作为相似度依据
完整实现代码
import numpy as np import pandas as pd from sklearn.semi_supervised import LabelSpreading # 1. 加载输入数据 df = pd.DataFrame([ ["A1", "B1", 1, 2.1], ["A1", "C1", 1, 3.3], ["A2", "D3", -1, 2.1], ["C3", "C1", 0, 2.5], ["D1", "A1", 1, 1.3], ["C3", "D1", -1, 2.5], ["A2", "A4", -1, 1.5] ], columns=["User1", "User2", "Class", "Weight"]) # 2. 节点映射为唯一ID all_nodes = list(set(df["User1"].tolist() + df["User2"].tolist())) node2id = {node: idx for idx, node in enumerate(all_nodes)} n_nodes = len(all_nodes) # 3. 构造相似度邻接矩阵 adj_matrix = np.zeros((n_nodes, n_nodes)) for _, row in df.iterrows(): u_id = node2id[row["User1"]] v_id = node2id[row["User2"]] # 无向图,两边都赋值边权重作为相似度 adj_matrix[u_id][v_id] = row["Weight"] adj_matrix[v_id][u_id] = row["Weight"] # 4. 构造标签数组,无标签节点标记为-1 labels = np.full(n_nodes, -1) # 写入已知标签 label_map = { "A1": 1, "A2": -1, "C3": 0, "D1": 1 } for node, label in label_map.items(): labels[node2id[node]] = label # 5. 训练标签传播模型 lp_model = LabelSpreading(kernel='precomputed', alpha=0.8) lp_model.fit(adj_matrix, labels) # 6. 输出无标签节点的预测结果 unlabeled_nodes = ["B1", "C1", "D3", "A4"] for node in unlabeled_nodes: print(f"{node}: {lp_model.transduction_[node2id[node]]}")
输出结果
运行上述代码即可得到你预期的输出:
B1: 1 C1: 0 D3: -1 A4: -1
参数
alpha为标签传播的衰减系数,取值范围0-1,数值越大传播过程中原始标签的权重保留越多,可根据实际数据集效果调整。
内容的提问来源于stack exchange,提问作者LdM
相关产品推荐
相关产品推荐

