diff --git a/function.py b/function.py index 8696acf..86185fd 100644 --- a/function.py +++ b/function.py @@ -40,68 +40,60 @@ name = "章程鸿" # 这里写自己的代码实现 -import numpy as np -from sklearn.model_selection import GridSearchCV -from sklearn.neighbors import KNeighborsClassifier - -def load_data(file_path): - """ - 加载 TSV 格式数据文件。 - """ - data = np.loadtxt(file_path, delimiter="\t") - features = data[:, :-1] - labels = data[:, -1].astype(int) - return features, labels - -def normalize_min_max(data): - """ - 对数据进行最小-最大缩放归一化。 - - Args: - - data (numpy array): 待归一化的数据。 - - Returns: - - numpy array: 归一化后的数据。 - - numpy array: 最小值。 - - numpy array: 最大值。 - """ - min_vals = data.min(0) - max_vals = data.max(0) - ranges = max_vals - min_vals - ranges[ranges == 0.0] = 1.0 # 避免除以零 - norm_data = (data - min_vals) / ranges - return norm_data, min_vals, max_vals - -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) - - # 归一化训练和测试数据 - train_data_normalized, min_vals, max_vals = normalize_min_max(train_data) - test_data_normalized = (test_data - min_vals) / (max_vals - min_vals) - - # 定义KNN分类器 - knn = KNeighborsClassifier() - - # 定义要搜索的k值范围 - param_grid = {'n_neighbors': list(range(1, 31))} - - # 使用GridSearchCV进行网格搜索 - grid_search = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy') - grid_search.fit(train_data_normalized, train_labels) - - # 获取最佳的k值 - optimal_k = grid_search.best_params_['n_neighbors'] - print("Optimal k:", optimal_k) - - # 使用最佳k值进行预测 - best_knn = KNeighborsClassifier(n_neighbors=optimal_k) - best_knn.fit(train_data_normalized, train_labels) - - # 对测试数据进行预测 - predicted_labels = best_knn.predict(test_data_normalized) - print("预测的分类标签是:", predicted_label[0]) \ No newline at end of file +import numpy as np +from sklearn.model_selection import GridSearchCV +from sklearn.neighbors import KNeighborsClassifier +from sklearn.preprocessing import MinMaxScaler +from sklearn.metrics import accuracy_score + +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" + test_file = "datingTestSet2.tsv" # 假设您有一个测试集文件 + + # 加载训练和测试数据 + train_data, train_labels = load_data(train_file) + test_data, test_labels = load_data(test_file) + + # 使用MinMaxScaler进行归一化 + scaler = MinMaxScaler() + train_data_normalized = scaler.fit_transform(train_data) + test_data_normalized = scaler.transform(test_data) + + # 定义KNN分类器 + knn = KNeighborsClassifier() + + # 定义要搜索的k值范围 + param_grid = {'n_neighbors': list(range(1, 31))} + + # 使用GridSearchCV进行网格搜索 + grid_search = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy') + grid_search.fit(train_data_normalized, train_labels) + + # 获取最佳的k值 + optimal_k = grid_search.best_params_['n_neighbors'] + print("Optimal k:", optimal_k) + + # 使用最佳k值进行预测 + best_knn = KNeighborsClassifier(n_neighbors=optimal_k) + best_knn.fit(train_data_normalized, train_labels) + + # 对测试数据进行预测 + predicted_labels = best_knn.predict(test_data_normalized) + + # 输出预测结果 + print("预测的分类标签是:") + for i, (predicted, actual) in enumerate(zip(predicted_labels, test_labels)): + print(f"样本 {i+1}: 预测标签: {predicted}, 实际标签: {actual}") + + # 计算并输出准确率 + accuracy = accuracy_score(test_labels, predicted_labels) + print(f"模型在测试集上的准确率为: {accuracy * 100:.2f}%") \ No newline at end of file