diff --git a/function.py b/function.py index 8b980c6..90c7ab3 100644 --- a/function.py +++ b/function.py @@ -1,47 +1,13 @@ -# function.py import numpy as np - -""" -挑战说明: -- 自行编写实现 KNN 分类算法。 -- 函数输入: 待分类的样本 inX, 训练数据集 dataSet, 训练集对应的标签 labels。 -- 函数返回: 预测的分类标签。 - -注意事项: -- 可以自行导入其他库,需要在 requirements.txt 添加依赖,若未在 requirements.txt 中添加使用到的依赖,则无法自动评测,成绩为零。 -- 在 function.py 中实现 KNN 分类算法。 -- 自动评测脚本仅会加载 classify0 函数,请勿修改函数名。 -- 训练集在本目录下的 datingTrainSet2.tsv 中。 -- 评测数据集在本目录下的 datingTestSet2.tsv 中。 - -挑战环境: -- CPU: Intel Xeon(R) CPU E3-1231 v3 @ 3.40GHz -- OS: Ubuntu 22.04.4 LTS -- Python: 3.10.12 -- numpy: 2.1.1 -""" - +import os """ 请在这里填写学号和姓名,不填写即成绩无效。 """ -id = "202210423103" -name = "王坤" +id = "202210423124" +name = "刘子豪" - -""" -参数说明: -- inX (numpy array): 输入待分类的样本。 -- dataSet (numpy array): 训练数据集。 -- labels (list or numpy array): 训练集对应的标签。 -- k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 -返回值: -- int: 预测的分类标签。 -""" - - -# 这里写自己的代码实现 -def classify(input_vector, dataSet, labels, k=3): +def classify0(input_vector, dataSet, labels, k=3): """ KNN 分类算法。 @@ -49,7 +15,7 @@ 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 算法参数,请**自行设置默认值**。 Returns: - int: 预测的分类标签。 @@ -68,62 +34,28 @@ def classify(input_vector, dataSet, labels, k=3): return predicted_label - -def load_dataset(directory): +def load_data(file_path): """ - 从文件夹中加载数据,若不自行正确实现,则无法通过评测,**不记录成绩**。 + 从 TSV 文件中加载数据集。 Args: - - directory (str): 数据文件夹路径。 + - file_path (str): TSV 文件路径。 Returns: - np.array: 特征数据。 - np.array: 标签数据。 """ - # 获取目录下所有文件名 - file_list = os.listdir(directory) - - # 初始化数据集矩阵和标签列表 - num_files = len(file_list) - data_set = np.zeros((num_files, 1024)) # 每个样本是1024维的向量 - labels = [] - - # 逐个文件处理 - for i, file_name in enumerate(file_list): - # 提取标签,假设文件名格式为 '数字_XXX.txt' - label = int(file_name.split('_')[0]) - labels.append(label) - - # 将图像文件转换为向量并存入数据集 - data_set[i, :] = img_to_vector(os.path.join(directory, file_name)) - - return data_set, np.array(labels) - -def img_to_vector(filename): - """ - 将二值图像转换为向量。 - 该部分应为 load_dataset 函数的辅助子函数,可单独在这里实现,也可直接集成至 load_dataset 函数中。 - - Args: - - filename (str): 图像文件路径。 - - Returns: - - np.array: 二值图像向量。 - """ - # 初始化一个1024维的向量 - vector = np.zeros(1024) - with open(filename, 'r') as f: - for row in range(32): - line = f.readline() - for col in range(32): - vector[row * 32 + col] = int(line[col]) # 将每行的字符转换为整数并存储 - return vector + data = np.loadtxt(file_path, delimiter='\t') + data_set = data[:, :-1] # 假设最后一列是标签 + labels = data[:, -1].astype(int) + return data_set, labels if __name__ == "__main__": # 以下代码可用于测试,可自行随意修改 - train_file = "datingTrainSet2.tsv" + train_data, train_labels = load_data(train_file) - train_data, train_labels = load_dataset(train_file) - - print(classify([65915, 3.868359, 0.128078], train_data, train_labels)) + # 示例测试样本,确保维度与训练数据一致 + test_sample = np.array([65915, 3.868359, 0.128078]) + prediction = classify0(test_sample, train_data, train_labels) + print(f"预测的分类标签: {prediction}")、 \ No newline at end of file