diff --git a/function.py b/function.py index b1f8c16..4c224a8 100644 --- a/function.py +++ b/function.py @@ -1,5 +1,4 @@ -# function.py -import numpy as np +#import numpy as np import os """ @@ -25,8 +24,8 @@ import os """ 请在这里填写学号和姓名,不填写即成绩无效。 """ -id = "202210423xxx" -name = "test_name" +id = "202210423118" +name = "刘国庆" """ @@ -41,7 +40,7 @@ name = "test_name" # 这里写自己的代码实现 -def classify(input_vector, dataSet, labels, k=0): +def classify(input_vector, dataSet, labels, k=3): """ KNN 分类算法。 @@ -54,6 +53,18 @@ def classify(input_vector, dataSet, labels, k=0): Returns: - int: 预测的分类标签。 """ + # 计算欧氏距离 + distances = np.linalg.norm(dataSet - input_vector, axis=1) + # 按照距离升序排序,并选择前 k 个最近的样本 + nearest_neighbors = np.argsort(distances)[:k] + # 统计每个标签出现的频率 + label_count = {} + for i in nearest_neighbors: + label = labels[i] + label_count[label] = label_count.get(label, 0) + 1 + # 返回出现次数最多的标签 + predicted_label = max(label_count, key=label_count.get) + return predicted_label # 这里也写自己的代码实现 @@ -68,6 +79,15 @@ def load_dataset(directory): - np.array: 特征数据。 - np.array: 标签数据。 """ + labels = [] + file_list = os.listdir(directory) + num_files = len(file_list) + data_set = np.zeros((num_files, 1024)) + for i, file_name in enumerate(file_list): + 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) # 这里还写自己的代码实现 @@ -82,6 +102,13 @@ def img_to_vector(filename): Returns: - np.array: 二值图像向量。 """ + vector = np.zeros((1, 1024)) + with open(filename) as f: + for i in range(32): + line = f.readline().strip() + for j in range(32): + vector[0, 32 * i + j] = int(line[j]) + return vector if __name__ == "__main__":