From 1e8ef418f4752bfc706bdf83758be09027857e95 Mon Sep 17 00:00:00 2001 From: 202210423203 <2579478480@qq.com> Date: Wed, 16 Oct 2024 22:45:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20function.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- function.py | 79 ++++++++++++----------------------------------------- 1 file changed, 17 insertions(+), 62 deletions(-) diff --git a/function.py b/function.py index 7933f3f..ebfbb04 100644 --- a/function.py +++ b/function.py @@ -1,31 +1,6 @@ import numpy as np import os -""" -实验说明: -- 自行编写实现数据加载与 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 = "202210423203" -name = "赵昊龙" - def classify(input_vector, dataSet, labels, k=3): """ KNN 分类算法。 @@ -34,28 +9,18 @@ def classify(input_vector, dataSet, labels, k=3): - input_vector (numpy array): 输入待分类的样本。 - dataSet (numpy array): 训练数据集。 - labels (list or numpy array): 训练集对应的标签。 - - k (int): kNN 算法参数。 + - k (int): kNN 算法参数,默认值为 3。 Returns: - int: 预测的分类标签。 """ - # 欧式距离 - diffMat = np.tile(input_vector, (dataSet.shape[0], 1)) - dataSet - sqDiffMat = diffMat**2 - sqDistances = sqDiffMat.sum(axis=1) - distances = sqDistances**0.5 - sortedDistIndices = distances.argsort() - - # 取出距离最近的k个点的标签 - classCount = {} + distances = np.linalg.norm(dataSet - input_vector, axis=1) + sorted_indices = np.argsort(distances) + class_count = {} for i in range(k): - voteIlabel = labels[sortedDistIndices[i]] - # 统计每个类别的出现次数 - classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 - - # 选择出现次数最多的类别作为预测标签 - sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True) - return sortedClassCount[0][0] + label = labels[sorted_indices[i]] + class_count[label] = class_count.get(label, 0) + 1 + return max(class_count, key=class_count.get) def load_dataset(directory): """ @@ -68,20 +33,17 @@ def load_dataset(directory): - np.array: 特征数据。 - np.array: 标签数据。 """ - fileList = os.listdir(directory) - m = len(fileList) - dataSet = np.zeros((m, 1024)) # 28*28的二值图像数据 + file_list = os.listdir(directory) + m = len(file_list) + dataset = np.zeros((m, 1024)) labels = [] - - for i in range(m): - filename = fileList[i] - fileWithPath = os.path.join(directory, filename) - vector = img_to_vector(fileWithPath) - dataSet[i, :] = vector - label = int(filename.split('.')[0]) # 假设文件名的格式为"数字.txt" + for i, file_name in enumerate(file_list): + file_path = os.path.join(directory, file_name) + vector = img_to_vector(file_path) + dataset[i, :] = vector + label = int(file_name.split('_')[0]) labels.append(label) - - return dataSet, np.array(labels) + return dataset, np.array(labels) def img_to_vector(filename): """ @@ -93,15 +55,8 @@ def img_to_vector(filename): Returns: - np.array: 二值图像向量。 """ - returnVect = np.zeros((1024,)) # 28*28的二值图像数据 with open(filename, 'r') as file: - lines = file.readlines() - n = 0 - for line in lines: - for i in range(len(line)-1): - returnVect[n] = int(line[i]) - n = n + 1 - return returnVect + return np.array([int(char) for char in file.read()]).reshape(-1, 1) if __name__ == "__main__": train_data, train_labels = load_dataset("trainingDigits")