diff --git a/function.py b/function.py index d9656bd..38b2c0a 100644 --- a/function.py +++ b/function.py @@ -1,26 +1,7 @@ -# function.py 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 -""" - +from collections import Counter +from sklearn.preprocessing import MinMaxScaler """ 请在这里填写学号和姓名,不填写即成绩无效。 @@ -28,23 +9,15 @@ import os id = "202210423210" name = "陈宇杰" - """ -参数说明: -- input_vector (numpy array): 输入待分类的样本。 -- dataSet (numpy array): 训练数据集。 -- labels (list or numpy array): 训练集对应的标签。 -- k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 +函数名称: load_data +功能: 加载训练数据集和测试数据集。 +参数: +- directory (str): 包含手写数字图像的文件夹路径。 返回值: -- int: 预测的分类标签。 +- dataSet (numpy array): 训练数据集或测试数据集,shape 为 (m, 1024)。 +- labels (numpy array): 训练集或测试集对应的标签,shape 为 (m,)。 """ - - -import numpy as np -import os -from collections import Counter - -# 加载数据的函数 def load_data(directory): file_list = os.listdir(directory) data_matrix = [] @@ -61,7 +34,14 @@ def load_data(directory): return np.array(data_matrix), np.array(labels) -# 将32x32的二值图像转换为1x1024的向量 +""" +函数名称: img_to_vector +功能: 将32x32的二值图像转换为1x1024的向量。 +参数: +- file_path (str): 图像文件的路径。 +返回值: +- vector (numpy array): 转换后的1x1024的向量。 +""" def img_to_vector(file_path): vector = np.zeros((1, 1024)) with open(file_path, 'r') as f: @@ -71,7 +51,17 @@ def img_to_vector(file_path): vector[0, 32 * i + j] = int(lines[i][j]) return vector -# kNN 分类函数 +""" +函数名称: classify +功能: 使用kNN算法对输入样本进行分类。 +参数: +- input_vector (numpy array): 输入待分类的样本,shape 为 (1024,)。 +- dataSet (numpy array): 训练数据集,shape 为 (m, 1024)。 +- labels (list or numpy array): 训练集对应的标签,shape 为 (m,)。 +- k (int): kNN 算法的参数,默认值为3。 +返回值: +- int: 预测的分类标签。 +""" def classify(input_vector, dataSet, labels, k=3): # 计算欧氏距离 distances = np.linalg.norm(dataSet - input_vector, axis=1) @@ -86,11 +76,36 @@ def classify(input_vector, dataSet, labels, k=3): most_common = Counter(nearest_labels).most_common(1) return most_common[0][0] -# 实验主程序 +""" +函数名称: normalize_data +功能: 对数据进行归一化处理,将特征缩放到相同范围,通常是 [0, 1]。 +参数: +- dataSet (numpy array): 需要归一化的训练数据集或测试数据集。 +返回值: +- normalized_dataSet (numpy array): 归一化后的数据集。 +""" +def normalize_data(dataSet): + # 将数据集 reshape 成二维数组 + num_samples = dataSet.shape[0] + dataSet_reshaped = dataSet.reshape(num_samples, -1) + + # 对数据进行归一化处理 + scaler = MinMaxScaler() + return scaler.fit_transform(dataSet_reshaped) + +""" +实验主程序: +- 加载训练集和测试集。 +- 测试 kNN 算法的分类效果,并计算分类精度。 +""" def main(): # 加载训练集和测试集 - training_data, training_labels = load_data('trainingdigits') - test_data, test_labels = load_data('testdigits') + training_data, training_labels = load_data('trainingDigits') + test_data, test_labels = load_data('testDigits') + + # 归一化数据 + training_data = normalize_data(training_data) + test_data = normalize_data(test_data) # 测试 kNN 算法 total_tests = len(test_data) @@ -111,4 +126,3 @@ def main(): if __name__ == '__main__': main() -