# function.py import numpy as np import os from collections import Counter """ 实验说明: - 自行编写实现数据加载与 kNN 的手写数字分类算法。 - 函数输入: 待分类的样本 input_vector, 训练数据集 dataSet, 训练集对应的标签 labels。 - 函数返回: 预测的分类标签。 注意事项: - 在 function.py 中实现 kNN 分类算法。 - 可以自行导入其他库,需要在 requirements.txt 添加依赖,若未在 requirements.txt 中添加使用到的依赖,则无法自动评测,成绩为零。 - 自动评测脚本仅会加载 classify 和 load_data 函数,请勿修改函数名。 - 训练集和测试集需手动下载解压,并放入当前目录下。 测评环境: - CPU: Intel Xeon(R) CPU E3-1231 v3 @ 3.40GHz - OS: Ubuntu 22.04.4 LTS - Python: 3.10.12 - numpy: 2.1.1 """ """ 请在这里填写学号和姓名,不填写即成绩无效。 """ id = "202210423107" name = "刘燚燊" def load_data(directory): """ 读取训练集或测试集的数字图像,转换为矩阵格式。 Args: directory (str): 数据集文件夹路径 Returns: dataSet (list): 图像数据集 labels (list): 对应的标签 """ dataSet = [] labels = [] # 遍历文件夹中的每个文件 for filename in os.listdir(directory): if filename.endswith('.txt'): # 将文件名的前缀(如 '9_45.txt' 的 '9')作为标签 label = int(filename.split('_')[0]) labels.append(label) # 读取文件内容并转换为一维数组 filepath = os.path.join(directory, filename) with open(filepath, 'r') as file: data = file.read().replace('\n', '') data_vector = np.array([int(pixel) for pixel in data]) dataSet.append(data_vector) return np.array(dataSet), np.array(labels) def classify(input_vector, dataSet, labels, k=3): """ 使用kNN算法进行分类 Args: input_vector (ndarray): 待分类样本 dataSet (ndarray): 训练数据集 labels (ndarray): 训练集标签 k (int): 选择的邻居数 Returns: int: 预测的分类标签 """ # 计算输入向量和训练集所有样本的欧氏距离 distances = np.linalg.norm(dataSet - input_vector, axis=1) # 获取距离最近的 k 个样本的索引 k_neighbors_indices = distances.argsort()[:k] # 获取这些样本对应的标签 k_neighbors_labels = labels[k_neighbors_indices] # 使用投票机制决定分类 most_common_label = Counter(k_neighbors_labels).most_common(1)[0][0] return most_common_label