11
Gitea Actions Experiment Test / Experiment-Actions (push) Successful in 10s

This commit is contained in:
lzh
2024-10-16 23:44:59 +08:00
parent 60398b3e6b
commit 19665a8133
+61 -125
View File
@@ -42,35 +42,10 @@ name = "廖子豪"
# 这里写自己的代码实现 # 这里写自己的代码实现
def classify(input_vector, dataSet, labels, k=3): import numpy as np
""" import os
KNN 分类算法。 from collections import Counter
Args:
- input_vector (numpy array): 输入待分类的样本。
- dataSet (numpy array): 训练数据集。
- labels (list or numpy array): 训练集对应的标签。
- k (int): kNN 算法参数,默认值为 3。
Returns:
- int: 预测的分类标签。
"""
# 计算输入向量与数据集中每个向量之间的欧几里得距离
distances = np.sqrt(np.sum((input_vector - dataSet) ** 2, axis=1))
# 获取距离最小的k个样本的索引
k_indices = np.argsort(distances)[:k]
# 获取这些样本对应的标签
k_nearest_labels = labels[k_indices]
# 使用Counter统计这些标签中出现次数最多的标签
label_count = Counter(k_nearest_labels)
# 返回出现次数最多的标签
return label_count.most_common(1)[0][0]
# 这里也写自己的代码实现
def img_to_vector(filename): def img_to_vector(filename):
""" """
将二值图像转换为向量。 将二值图像转换为向量。
@@ -81,7 +56,10 @@ def img_to_vector(filename):
Returns: Returns:
- np.array: 二值图像向量。 - np.array: 二值图像向量。
""" """
return np.array([int(char) for line in open(filename) for char in line.strip()]) with open(filename, 'r') as file:
lines = file.readlines()
vector = [int(pixel) for line in lines for pixel in line.strip()]
return np.array(vector)
def load_dataset(directory): def load_dataset(directory):
""" """
@@ -96,30 +74,35 @@ def load_dataset(directory):
""" """
images = [] images = []
labels = [] labels = []
# 遍历目录中的所有子目录
for label_dir in os.listdir(directory): for label_dir in os.listdir(directory):
# 构建完整的子目录路径
label_dir_path = os.path.join(directory, label_dir) label_dir_path = os.path.join(directory, label_dir)
# 确保是目录而不是文件
if os.path.isdir(label_dir_path): if os.path.isdir(label_dir_path):
# 遍历目录中的所有文件
for filename in os.listdir(label_dir_path): for filename in os.listdir(label_dir_path):
# 构建完整的文件路径
file_path = os.path.join(label_dir_path, filename) file_path = os.path.join(label_dir_path, filename)
# 读取文件内容并转换为向量
image_vector = img_to_vector(file_path) image_vector = img_to_vector(file_path)
# 添加向量和标签到列表中
images.append(image_vector) images.append(image_vector)
labels.append(int(label_dir)) labels.append(int(label_dir))
# 将列表转换为 NumPy 数组
return np.array(images), np.array(labels) return np.array(images), np.array(labels)
# 示例用法 def classify(input_vector, dataSet, labels, k=3):
"""
KNN 分类算法。
Args:
- input_vector (numpy array): 输入待分类的样本。
- dataSet (numpy array): 训练数据集。
- labels (list or numpy array): 训练集对应的标签。
- k (int): kNN 算法参数,默认值为 3。
Returns:
- int: 预测的分类标签。
"""
distances = np.sqrt(np.sum((input_vector - dataSet) ** 2, axis=1))
k_indices = np.argsort(distances)[:k]
k_nearest_labels = labels[k_indices]
label_count = Counter(k_nearest_labels)
return label_count.most_common(1)[0][0]
if __name__ == "__main__": if __name__ == "__main__":
train_dir = "trainingDigits" # 训练集目录 train_dir = "trainingDigits" # 训练集目录
test_dir = "testDigits" # 测试集目录 test_dir = "testDigits" # 测试集目录
@@ -131,86 +114,39 @@ if __name__ == "__main__":
print("训练集标签形状:", train_labels.shape) print("训练集标签形状:", train_labels.shape)
print("测试集特征形状:", test_images.shape) print("测试集特征形状:", test_images.shape)
print("测试集标签形状:", test_labels.shape) print("测试集标签形状:", test_labels.shape)
# 这里还写自己的代码实现
def img_to_vector(filename):
"""
将二值图像转换为向量。
Args: # 测试 classify 函数
- filename (str): 图像文件路径。 test_data = np.array([int(char) for char in "00000000000000110000000000000000000" # 示例数据
"00000000000011111000000000000000"
Returns: "00000000000011111100000000000000"
- np.array: 二值图像向量。 "00000000001111111110000000000000"
""" "00000000001111111110000000000000"
with open(filename, 'r') as file: "00000000001111111100000000000000"
# 读取文件的每一行 "00000000011111111000000000000000"
lines = file.readlines() "00000000111111111000000000000000"
"00000000111111110000000000000000"
# 初始化一个空列表来存储向量 "00000000111111110000000000000000"
vector = [] "00000000111111110000000000000000"
"00000000111111110000000000000000"
# 遍历每一行,将每个字符转换为整数并添加到列表中 "00000000111111100000000000000000"
for line in lines: "00000001111111100000000000000000"
vector.extend([int(pixel) for pixel in line.strip()]) "00000001111111100000000000000000"
"00000001111111100000000000000000"
# 将列表转换为 NumPy 数组并返回 "00000001111111111111000000000000"
return np.array(vector) "00000001111111111111111000000000"
"00000001111111111111111100000000"
# 示例用法 "00000011111111111111111110000000"
if __name__ == "__main__": "00000011111111111111111110000000"
# 假设有一个图像文件路径 "00000001111111111111111110000000"
filename = "path_to_your_image_file.txt" "00000001111111111111111110000000"
"00000000111111111100111111100000"
# 调用函数并打印结果 "00000000111111111000111111100000"
image_vector = img_to_vector(filename) "00000000011111111001111111100000"
print("图像向量:", image_vector) "00000000011111111111111111000000"
print("向量形状:", image_vector.shape) "00000000001111111111111111000000"
"00000000000111111111111111000000"
"00000000000011111111111100000000"
if __name__ == "__main__": "00000000000001111111110000000000"
# 以下代码可用于测试,可自行随意修改 "00000000000000000111100000000000"] * 4).reshape(1, 1024)
train_data, train_labels = load_dataset("trainingDigits") predicted_label = classify(test_data, train_images, train_labels)
print(f"预测的标签: {predicted_label}")
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"
)
predicted_label = classify(
np.array([int(char) for char in test_data]).reshape(1, 1024),
train_data,
train_labels,
)
print(f"预测的标签: {predicted_label}")