如何在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,提问作者Никита Михалков
相关产品推荐
相关产品推荐

