You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:36:04