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

如何在KNN算法中使用加权标签,基于numpy实现加权KNN预测

加权KNN预测逻辑NumPy实现方案

加权KNN的核心逻辑是给距离更近的近邻分配更高的投票权重,最常用的实现方案是距离倒数加权,距离越小权重越高,以下是直接适配你现有函数签名的实现:


完整代码实现

import numpy as np

def predict(indices, distances, labels):
    # 取出每个待预测样本对应的近邻标签
    neighbor_labels = labels[indices]
    # 计算近邻权重:距离倒数加极小值防止除以0
    weights = 1 / (distances + 1e-8)
    # 按类别累加权重,取总权重最高的类别作为预测结果
    pred = [np.bincount(labels_per_sample, weights=weights_per_sample).argmax() 
            for labels_per_sample, weights_per_sample in zip(neighbor_labels, weights)]
    return np.asarray(pred)

代码说明

  • 完全兼容你现有的参数格式,仅在原有普通KNN的实现基础上新增了权重参数,可读性极强
  • 1e-8的极小值用于处理近邻距离为0的场景,此时该近邻的权重会远高于其他近邻,相当于直接以该近邻的标签作为预测结果,符合业务逻辑
  • 如果需要适配大规模预测场景,可替换为全向量化实现,避免列表推导的循环开销,示例如下:
def predict(indices, distances, labels):
    n_samples, n_neighbors = indices.shape
    n_classes = labels.max() + 1
    neighbor_labels = labels[indices]
    weights = 1 / (distances + 1e-8)
    # 构造独热编码矩阵后按权重加权求和
    one_hot = np.zeros((n_samples, n_neighbors, n_classes))
    one_hot[np.arange(n_samples)[:, None], np.arange(n_neighbors), neighbor_labels] = 1
    weighted_sum = (one_hot * weights[..., None]).sum(axis=1)
    return weighted_sum.argmax(axis=1)

测试验证

用你给出的示例参数运行,返回的预测结果为:
array([0, 0, 0, 1]),符合加权KNN的预期输出。


内容的提问来源于stack exchange,提问作者Никита Михалков

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:06:10