diff --git a/function.py b/function.py index 37e9f8d..94c82c8 100644 --- a/function.py +++ b/function.py @@ -1,7 +1,6 @@ # function.py import numpy as np import os -from collections import Counter """ 实验说明: @@ -41,41 +40,90 @@ name = "邓龙树" """ -# KNN 分类算法 -def classify(input_vector, dataSet, labels, k=3): - # 计算输入向量与训练集中每个样本的距离 - distances = [np.linalg.norm(input_vector - data) for data in dataSet] - # 根据距离排序并获取前 k 个标签 - k_indices = np.argsort(distances)[:k] - k_labels = [labels[index] for index in k_indices] - # 对 k 个标签进行投票,返回出现次数最多的标签 - vote = Counter(k_labels).most_common(1)[0][0] - return vote +# 这里写自己的代码实现 +import numpy as np +import os +from collections import Counter + +# 这里写自己的代码实现 +def classify(input_vector, dataSet, labels, k=3): + """ + 使用 KNN 算法对输入样本进行分类。 + + 参数: + - input_vector (numpy array): 输入待分类的样本(1xN)。 + - dataSet (numpy array): 训练数据集(MxN)。 + - labels (list or numpy array): 训练集对应的标签。 + - k (int): kNN 算法参数,默认值为 3。 + + 返回: + - int: 预测的分类标签。 + """ + # 计算输入向量与训练集之间的欧氏距离 + distances = np.sum((input_vector - dataSet) ** 2, axis=1) ** 0.5 + # 根据距离排序并获取索引 + sorted_indices = distances.argsort() + # 选择距离最近的k个点 + k_nearest_labels = labels[sorted_indices[:k]].tolist() # 将 NumPy 数组转换为列表 + # 统计k个点中各类别的数量 + count = Counter(k_nearest_labels) + # 返回数量最多的类别标签 + return count.most_common(1)[0][0] -# 从文件夹中加载数据 -def load_dataset(directory): +# 这里也写自己的代码实现 +def load_dataset(directory): + """ + 加载数据集中的图像,并将其转换为特征向量和标签。 + + 参数: + - directory (str): 数据文件夹路径。 + + 返回: + - np.array: 特征数据(Mx1024)。 + - np.array: 标签数据(Mx1)。 + """ + # 初始化特征数据列表和标签列表 feature_list = [] label_list = [] + # 遍历目录中的所有文件 for file in os.listdir(directory): + # 获取文件的完整路径 file_path = os.path.join(directory, file) - feature = img_to_vector(file_path) - label = int(file.split('_')[0]) - feature_list.append(feature) - label_list.append(label) - return np.array(feature_list), np.array(label_list) - - -# 将二值图像转换为向量 -def img_to_vector(filename): - with open(filename, 'r') as f: - return np.array([int(char) for char in f.read().strip()]) - + # 将图像文件转换为向量 + feature_vector = img_to_vector(file_path) + # 将特征向量添加到列表中 + feature_list.append(feature_vector) + # 获取文件名中的标签并添加到标签列表中 + label_list.append(int(file.split('_')[0])) + # 将特征列表和标签列表转换为numpy数组 + feature_matrix = np.array(feature_list) + label_array = np.array(label_list) + return feature_matrix, label_array +# 这里还写自己的代码实现 +def img_to_vector(filename): + """ + 将二值图像转换为向量。 + + Args: + - filename (str): 图像文件路径。 + + Returns: + - np.array: 二值图像向量。 + """ + # 初始化向量 + vector = np.zeros((1024,)) # 创建一个一维数组 + # 打开文件并逐行读取 + with open(filename) as file: + for i, line in enumerate(file): + # 将每行的数字字符转换为整数并存储到向量中 + vector[i*32:i*32+32] = np.array([int(char) for char in line.strip()]) + return vector if __name__ == "__main__": - #加载训练数据 + # 以下代码可用于测试,可自行随意修改 train_data, train_labels = load_dataset("trainingDigits") - #测试数据 + test_data = ( "00000000000000110000000000000000" "00000000000011111000000000000000" @@ -110,9 +158,11 @@ if __name__ == "__main__": "00000000000001111111110000000000" "00000000000000000111100000000000" ) - # 将测试数据转换为向量 - test_vector = np.array([int(char) for char in test_data]).reshape(1, 1024) - - # 进行分类预测 - predicted_label = classify(test_vector, train_data, train_labels) + predicted_label = classify( + np.array([int(char) for char in test_data]).reshape(1, 1024), + train_data, + train_labels, + ) + print(f"预测的标签: {predicted_label}") +