From c1b01127c319c7801efc5496b8b3c9f04f18e6fd Mon Sep 17 00:00:00 2001 From: anye <513317375@qq.com> Date: Mon, 4 Nov 2024 17:57:00 +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 | 142 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 105 insertions(+), 37 deletions(-) diff --git a/function.py b/function.py index 937e5a5..3fe6ca7 100644 --- a/function.py +++ b/function.py @@ -7,45 +7,113 @@ from sklearn.preprocessing import StandardScaler id = "202210423206" name = "詹宇豪" -def train_logreg(X, y, random_state=42): - model = LogisticRegression(solver='liblinear', random_state=random_state) - model.fit(X, y) - return model -def predict_logreg(inX, model): - return int(model.predict([inX])[0]) +def classify(input_vector, dataSet, labels, k=1): + """ + KNN 分类算法。 + + Args: + - input_vector (numpy array): 输入待分类的样本。 + - dataSet (numpy array): 训练数据集。 + - labels (list or numpy array): 训练集对应的标签。 + - k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。 + + Returns: + - int: 预测的分类标签。 + """ + # 计算欧氏距离 + distances = np.linalg.norm(dataSet - input_vector, axis=1) + # 获取距离最近的 k 个样本的索引 + nearest_neighbors_indices = distances.argsort()[:k] + # 获取这些样本的标签 + nearest_labels = np.array(labels)[nearest_neighbors_indices] + # 统计出现次数最多的标签并返回 + predicted_label = np.bincount(nearest_labels).argmax() + return predicted_label + +# 这里也写自己的代码实现 +def load_dataset(directory): + """ + 从文件夹中加载数据,若不自行正确实现,则无法通过评测,**不记录成绩**。 + + Args: + - directory (str): 数据文件夹路径。 + + Returns: + - np.array: 特征数据。 + - np.array: 标签数据。 + """ + labels = [] + data_list = [] + for filename in os.listdir(directory): + if filename.endswith(".txt"): # 确保读取的是 txt 文件 + label = int(filename.split('_')[0]) + labels.append(label) + vector = img_to_vector(os.path.join(directory, filename)) + data_list.append(vector) + return np.array(data_list), np.array(labels) + +# 这里还写自己的代码实现 +def img_to_vector(filename): + """ + 将二值图像转换为向量。 + 该部分应为 load_dataset 函数的辅助子函数,可单独在这里实现,也可直接集成至 load_dataset 函数中。 + + Args: + - filename (str): 图像文件路径。 + + Returns: + - np.array: 二值图像向量。 + """ + with open(filename, 'r') as f: # 确保使用文本模式读取 + lines = f.readlines() + vector = np.zeros((1024,), dtype=int) # 将其改为 (1024,) 的一维数组 + for i in range(32): + for j in range(32): + vector[32 * i + j] = int(lines[i][j]) + return vector -def load_data(filepath): - data = np.genfromtxt(filepath, delimiter=' ', missing_values='?', filling_values=0) - labels = data[:, -1].astype(int) - data = data[:, :-1] - labels = np.where((labels == 2) | (labels == 3), 0, labels) - if data.shape[1] >= 3: - data = np.delete(data, 2, axis=1) - scaler = StandardScaler() - data = scaler.fit_transform(data) - return data, labels -# 测试代码 if __name__ == "__main__": - # 指定数据文件路径 - filepath = "./data/horse-colic.data" + # 测试代码 + train_data, train_labels = load_dataset("trainingDigits") + + test_data = ( + "00000000000000110000000000000000" + "00000000000011111000000000000000" + "00000000000011111100000000000000" + "00000000001111111110000000000000" + "00000000001111111110000000000000" + "00000000001111111100000000000000" + "00000000011111111000000000000000" + "00000000111111111000000000000000" + "00000000111111110000000000000000" + "00000000111111110000000000000000" + "00000000111111110000000000000000" + "00000000111111110000000000000000" + "00000000111111100000000000000000" + "00000001111111100000000000000000" + "00000001111111100000000000000000" + "00000001111111100000000000000000" + "00000001111111111111000000000000" + "00000001111111111111111000000000" + "00000001111111111111111100000000" + "00000011111111111111111110000000" + "00000011111111111111111110000000" + "00000001111111111111111110000000" + "00000001111111111111111110000000" + "00000000111111111100111111100000" + "00000000111111111000111111100000" + "00000000011111111001111111100000" + "00000000011111111111111111000000" + "00000000001111111111111111000000" + "00000000000111111111111111000000" + "00000000000011111111111100000000" + "00000000000001111111110000000000" + "00000000000000000111100000000000" + ) - # 加载数据 - X, y = load_data(filepath) - print("数据加载成功。") - - # 训练模型 - model = train_logreg(X, y) - print("模型训练完成。") - - # 随机一个样本进行预测测试 - sample = X[0] - actual_label = y[0] - predicted_label = predict_logreg(sample, model) - print(f"预测结果: {predicted_label}, 实际结果: {actual_label}") - - # 计算测试集上的准确率 - correct_predictions = sum(predict_logreg(X[i], model) == y[i] for i in range(len(y))) - accuracy = correct_predictions / len(y) - print(f"测试集准确率: {accuracy:.2f}") \ No newline at end of file + test_vector = np.array([int(char) for char in test_data]).reshape(1, 1024) + + predicted_label = classify(test_vector, train_data, train_labels) + print(f"预测的标签: {predicted_label}") \ No newline at end of file