From 78a950c283c38e890b3cbd912929937c341c8017 Mon Sep 17 00:00:00 2001 From: 202210423104 <1961532386@qq.com> Date: Wed, 16 Oct 2024 21:55:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- function.py | 140 ++++++++++++++++++++++++---------------------------- 1 file changed, 64 insertions(+), 76 deletions(-) diff --git a/function.py b/function.py index 2393b3b..cbe0062 100644 --- a/function.py +++ b/function.py @@ -1,76 +1,64 @@ -# 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 -""" - - -""" -请在这里填写学号和姓名,不填写即成绩无效。 -""" -id = "202210423xxx" -name = "test_name" - - -""" -参数说明: -- inX (numpy array): 输入待分类的样本。 -- dataSet (numpy array): 训练数据集。 -- labels (list or numpy array): 训练集对应的标签。 -- k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 -返回值: -- int: 预测的分类标签。 -""" - - -# 这里写自己的代码实现 -def classify0(inX, dataSet, labels, k=0): - """ - KNN 分类算法。 - - Args: - - inX (numpy array): 输入待分类的样本。 - - dataSet (numpy array): 训练数据集。 - - labels (list or numpy array): 训练集对应的标签。 - - k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 - - Returns: - - int: 预测的分类标签。 - """ - - -def load_data(file_path): - """ - 加载 TSV 格式数据文件。 - """ - data = np.loadtxt(file_path, delimiter="\t") - features = data[:, :-1] - labels = data[:, -1].astype(int) - return features, labels - - -if __name__ == "__main__": - # 以下代码可用于测试,可自行随意修改 - - train_file = "datingTrainSet2.tsv" - - train_data, train_labels = load_data(train_file) - - print(classify0([65915, 3.868359, 0.128078], train_data, train_labels)) +# function.py +import numpy as np +from collections import Counter + + +id = "202210423104" +name = "张钦诚" + + + +def classify0(inX, dataSet, labels, k=3): + + # 转换输入样本为numpy数组 + inX = np.array(inX) + + # 计算欧氏距离 + # 使用广播计算所有训练样本与输入样本的距离 + distances = np.linalg.norm(dataSet - inX, axis=1) + + # 获取距离最小的k个样本的索引 + nearest_indices = distances.argsort()[:k] + + # 获取这k个样本的标签 + nearest_labels = labels[nearest_indices] + + # 统计出现次数最多的标签 + label_count = Counter(nearest_labels) + + # 返回出现次数最多的标签 + return label_count.most_common(1)[0][0] + + +def load_data(file_path): + + data = np.loadtxt(file_path, delimiter="\t") + features = data[:, :-1] + labels = data[:, -1].astype(int) + return features, labels + + +if __name__ == "__main__": + # 以下代码可用于测试,可自行随意修改 + + train_file = "datingTrainSet2.tsv" + test_file = "datingTestSet2.tsv" + + # 加载训练数据 + train_data, train_labels = load_data(train_file) + + # 加载测试数据 + test_data, test_labels = load_data(test_file) + + # 测试样本 + test_sample = [65915, 3.868359, 0.128078] + + # 预测标签 + predicted_label = classify0(test_sample, train_data, train_labels) + + print(f"预测的分类标签: {predicted_label}") + + # 计算准确率 + predictions = np.array([classify0(sample, train_data, train_labels) for sample in test_data]) + accuracy = np.mean(predictions == test_labels) * 100 + print(f"准确率: {accuracy:.2f}%")