From 3647f7c3cb6a6bc82d70a33f9d89c87f90831ffa Mon Sep 17 00:00:00 2001 From: Xionghaoran <719929980@qq.com> Date: Mon, 14 Oct 2024 21:50:55 +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 | 51 +++++++-------------------------------------------- 1 file changed, 7 insertions(+), 44 deletions(-) diff --git a/function.py b/function.py index e95bc5d..d16310e 100644 --- a/function.py +++ b/function.py @@ -1,7 +1,5 @@ # function.py import numpy as np -import pandas as pd -from sklearn.preprocessing import StandardScaler """ 挑战说明: @@ -45,22 +43,17 @@ name = "熊浩燃" # 这里写自己的代码实现 def classify0(inX, dataSet, labels, k=3): """ - KNN 分类算法,使用马氏距离。 + KNN 分类算法。 Args: - inX (numpy array): 输入待分类的样本。 - dataSet (numpy array): 训练数据集。 - labels (list or numpy array): 训练集对应的标签。 - - k (int): kNN 算法参数,默认值为 3。 + - k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 Returns: - int: 预测的分类标签。 """ - # 标准化数据 - scaler = StandardScaler() - dataSet = scaler.fit_transform(dataSet) - inX = scaler.transform([inX])[0] - # 计算协方差矩阵的逆 cov_matrix = np.cov(dataSet, rowvar=False) inv_cov_matrix = np.linalg.inv(cov_matrix) @@ -81,45 +74,15 @@ def load_data(file_path): """ 加载 TSV 格式数据文件。 """ - data = pd.read_csv(file_path, sep='\t', header=None).values + data = np.loadtxt(file_path, delimiter="\t") features = data[:, :-1] labels = data[:, -1].astype(int) return features, labels -def find_best_k(X_train, y_train): - """ - 寻找最佳 k 值。 - """ - best_k = 1 - best_accuracy = 0 - - for k in range(1, 21): - # 使用 classify0 进行预测 - y_pred = [classify0(x, X_train, y_train, k) for x in X_train] - accuracy = np.mean(y_pred == y_train) - - if accuracy > best_accuracy: - best_accuracy = accuracy - best_k = k - - return best_k, best_accuracy if __name__ == "__main__": - train_file = "datingTestSet2.tsv" - X, y = load_data(train_file) + # 以下代码可用于测试,可自行随意修改 - # 标准化特征 - scaler = StandardScaler() - X = scaler.fit_transform(X) - - # 寻找最佳 k 值 - best_k, best_accuracy = find_best_k(X, y) - - # 输出最佳 k 值和对应的准确率 - print(f"最佳 k 值: {best_k}, 准确率: {best_accuracy:.2f}") - - # 进行预测 - sample = np.array([65915, 3.868359, 0.128078]) - sample = scaler.transform([sample])[0] # 标准化样本 - predicted_label = classify0(sample, X, y, best_k) - print(f"预测结果: {predicted_label}") + train_file = "datingTrainSet2.tsv" + train_data, train_labels = load_data(train_file) + print(classify0(np.array([65915, 3.868359, 0.128078]), train_data, train_labels)) \ No newline at end of file