From 774c006062fa116d1f1d2adfb7cee84d9ff4d5f0 Mon Sep 17 00:00:00 2001 From: Frae19 <515745323@qq.com> Date: Thu, 17 Oct 2024 16:52:41 +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 | 149 ++++++++++++++++++++++++++++------------------------ 1 file changed, 79 insertions(+), 70 deletions(-) diff --git a/function.py b/function.py index 73cc298..3a48f96 100644 --- a/function.py +++ b/function.py @@ -1,88 +1,97 @@ -# function.py -import numpy as np -from collections import Counter -""" -挑战说明: -- 自行编写实现 KNN 分类算法。 -- 函数输入: 待分类的样本 inX, 训练数据集 dataSet, 训练集对应的标签 labels。 -- 函数返回: 预测的分类标签。 +# function.py +import numpy as np -注意事项: -- 可以自行导入其他库,需要在 requirements.txt 添加依赖,若未在 requirements.txt 中添加使用到的依赖,则无法自动评测,成绩为零。 -- 在 function.py 中实现 KNN 分类算法。 -- 自动评测脚本仅会加载 classify0 函数,请勿修改函数名。 -- 训练集在本目录下的 datingTrainSet2.tsv 中。 -- 评测数据集在本目录下的 datingTestSet2.tsv 中。 +""" +挑战说明: +- 自行编写实现 KNN 分类算法。 +- 函数输入: 待分类的样本 inX, 训练数据集 dataSet, 训练集对应的标签 labels。 +- 函数返回: 预测的分类标签。 -挑战环境: -- CPU: Intel Xeon(R) CPU E3-1231 v3 @ 3.40GHz -- OS: Ubuntu 22.04.4 LTS -- Python: 3.10.12 -- numpy: 2.1.1 -""" +注意事项: +- 可以自行导入其他库,需要在 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 = "202210423629" -name = "Tanjunfeng" +""" +请在这里填写学号和姓名,不填写即成绩无效。 +""" +id = "202210423629" +name = "Tanjunfeng" -""" -参数说明: -- inX (numpy array): 输入待分类的样本。 -- dataSet (numpy array): 训练数据集。 -- labels (list or numpy array): 训练集对应的标签。 -- k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 -返回值: -- int: 预测的分类标签。 -""" +""" +参数说明: +- inX (numpy array): 输入待分类的样本。 +- dataSet (numpy array): 训练数据集。 +- labels (list or numpy array): 训练集对应的标签。 +- k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 +返回值: +- int: 预测的分类标签。 +""" -# 这里写自己的代码实现 -def classify0(inX, dataSet, labels, k=3): - """ - KNN 分类算法。 +# 这里写自己的代码实现 +def classify0(inX, dataSet, labels, k=3): + """ + KNN 分类算法。 - Args: - - inX (numpy array): 输入待分类的样本。 - - dataSet (numpy array): 训练数据集。 - - labels (list or numpy array): 训练集对应的标签。 - - k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 + Args: + - inX (numpy array): 输入待分类的样本。 + - dataSet (numpy array): 训练数据集。 + - labels (list or numpy array): 训练集对应的标签。 + - k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 - Returns: - - int: 预测的分类标签。 - """ - # 计算输入向量与训练集中每一个样本的欧式距离 - distances = np.sqrt(np.sum((dataSet - inX) ** 2, axis=1)) + Returns: + - int: 预测的分类标签。 + """ + # 计算欧式距离 + dataSetSize = dataSet.shape[0] + diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet + sqDiffMat = diffMat**2 + sqDistances = sqDiffMat.sum(axis=1) + distances = np.sqrt(sqDistances) - # 通过对距离进行升序排序并选择前k个最近距离的索引 - nearest_neighbors_indices = distances.argsort()[:k] + # 按距离从小到大排序 + sortedDistIndices = distances.argsort() - # 收集k个最近距离的样本的标签 - nearest_labels = [labels[i] for i in nearest_neighbors_indices] + # 选择距离最小的k个点 + classCount = {} + for i in range(k): + voteIlabel = labels[sortedDistIndices[i]] + classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 - # 使用计数器查找出现频率最高的标签 - most_common_label = Counter(nearest_labels).most_common(1)[C_0]()[C_0]() - - return most_common_label - -def load_data(file_path): - """ - 加载 TSV 格式数据文件。 - """ - data = np.loadtxt(file_path, delimiter="\t") - features = data[:, :-1] - labels = data[:, -1].astype(int) - return features, labels + # 按类别票数从大到小排序 + sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True) + + # 返回出现频率最高的类别 + return sortedClassCount[0][0] -if __name__ == "__main__": - # 以下代码可用于测试,可自行随意修改 +def load_data(file_path): + """ + 加载 TSV 格式数据文件。 + """ + data = np.loadtxt(file_path, delimiter="\t") + features = data[:, :-1] + labels = data[:, -1].astype(int) + return features, labels - train_file = "datingTrainSet2.tsv" - train_data, train_labels = load_data(train_file) +if __name__ == "__main__": + # 以下代码可用于测试,可自行随意修改 - print(classify0([65915, 3.868359, 0.128078], train_data, train_labels)) + train_file = "datingTrainSet2.tsv" + + train_data, train_labels = load_data(train_file) + + print(classify0([65915, 3.868359, 0.128078], train_data, train_labels)) \ No newline at end of file