From 01e976f847dda7a9bf7e4e4b8bf0ae7e086c4970 Mon Sep 17 00:00:00 2001 From: llll <2992513220@qq.com> Date: Wed, 16 Oct 2024 20:47:59 +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, 36 insertions(+), 43 deletions(-) diff --git a/function.py b/function.py index b1f8c16..031e606 100644 --- a/function.py +++ b/function.py @@ -25,8 +25,8 @@ import os """ 请在这里填写学号和姓名,不填写即成绩无效。 """ -id = "202210423xxx" -name = "test_name" +id = "202210423109" +name = "李燕如" """ @@ -41,52 +41,45 @@ name = "test_name" # 这里写自己的代码实现 -def classify(input_vector, dataSet, labels, k=0): - """ - KNN 分类算法。 +def classify(input_vector, dataSet, labels, k=3): +    # 计算输入向量与数据集中每个样本的欧氏距离 +    distances = np.sqrt(((dataSet - input_vector) ** 2).sum(axis=1)) +    # 获取距离最近的k个样本的索引 +    sortedDistIndices = distances.argsort() +    # 获取这些样本对应的标签 +    classCount = {} +    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] - Args: - - input_vector (numpy array): 输入待分类的样本。 - - dataSet (numpy array): 训练数据集。 - - labels (list or numpy array): 训练集对应的标签。 - - k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 - - Returns: - - int: 预测的分类标签。 - """ - - -# 这里也写自己的代码实现 def load_dataset(directory): - """ - 从文件夹中加载数据,若不自行正确实现,则无法通过评测,**不记录成绩**。 +    fileList = os.listdir(directory) +    m = len(fileList) +    dataSet = np.zeros((m, 1024)) +    labels = [] +    for i, file in enumerate(fileList): +        path = os.path.join(directory, file) +        vector = img_to_vector(path) +        dataSet[i, :] = vector +        label = int(file.split('_')[0]) +        labels.append(label) +    return dataSet, np.array(labels) - Args: - - directory (str): 数据文件夹路径。 - - Returns: - - np.array: 特征数据。 - - np.array: 标签数据。 - """ - - -# 这里还写自己的代码实现 def img_to_vector(filename): - """ - 将二值图像转换为向量。 - 该部分应为 load_dataset 函数的辅助子函数,可单独在这里实现,也可直接集成至 load_dataset 函数中。 - - Args: - - filename (str): 图像文件路径。 - - Returns: - - np.array: 二值图像向量。 - """ - - +    returnVect = np.zeros(1024) +    with open(filename, 'r') as fr: +        lines = fr.read().replace('\n', '') +        for i in range(32): +            for j in range(32): +                returnVect[i*32 + j] = int(lines[i*32 + j]) +    return returnVect if __name__ == "__main__": - # 以下代码可用于测试,可自行随意修改 - train_data, train_labels = load_dataset("trainingDigits") +    # 使用绝对路径加载数据集 +    directory = r"C:\Users\HP\Desktop\trainingDigits" +    train_data, train_labels = load_dataset(directory) test_data = ( "00000000000000110000000000000000"