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

基于Numpy实现K近邻算法:如何获取给定数据集的测试集标签?

用Numpy实现K近邻分类算法

核心思路

K近邻的逻辑非常直接:对每个测试样本,计算它与所有训练样本的距离,找出距离最近的K个样本,通过这K个样本的标签投票得出该测试样本的预测结果。以下是针对你给出的数据集维度的具体实现方案:

实现步骤与代码

import numpy as np

def knn_classifier(X_train, y_train, X_test, k=3):
    # 获取训练集、测试集的样本数量
    num_train = X_train.shape[0]
    num_test = X_test.shape[0]
    
    # 初始化测试集预测标签数组,类型与训练标签保持一致
    y_pred = np.zeros(num_test, dtype=y_train.dtype)
    
    # 遍历每个测试样本计算距离并预测
    for i in range(num_test):
        # 计算当前测试样本与所有训练样本的欧氏距离
        distances = np.sqrt(np.sum((X_train - X_test[i])**2, axis=1))
        
        # 排序后取距离最小的k个样本的索引
        closest_indices = np.argsort(distances)[:k]
        
        # 获取这k个样本对应的标签
        closest_labels = y_train[closest_indices]
        
        # 统计标签出现次数,选出出现次数最多的作为预测结果
        unique_labels, counts = np.unique(closest_labels, return_counts=True)
        y_pred[i] = unique_labels[np.argmax(counts)]
    
    return y_pred

# 示例数据(替换为你的真实数据即可)
X_train = np.random.rand(1000, 400)  # 维度(1000,400)的训练集
y_train = np.random.randint(0, 5, size=1000)  # 长度1000的训练标签
X_test = np.random.rand(300, 400)  # 维度(300,400)的测试集

# 调用函数得到测试集预测标签
y_test_pred = knn_classifier(X_train, y_train, X_test, k=3)

关键细节说明

  • 距离类型调整:示例中用的是欧氏距离,如果需要曼哈顿距离,可将距离计算代码替换为np.sum(np.abs(X_train - X_test[i]), axis=1)。
  • K值选择:建议选择奇数,避免投票平局;若出现平局,上述代码会返回字典序靠前的标签,你也可根据需求修改为随机选择等逻辑。
  • 效率优化:如果数据集规模更大,可通过np.expand_dims扩展测试集维度,用向量运算替代显式循环进一步提升效率,不过针对你给出的(300,400)测试集,当前循环的效率已足够。

内容的提问来源于stack exchange,提问作者ethereal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:25:17