generated from LufsX/Experiment-kNN
This commit is contained in:
+61
-125
@@ -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}")
|
|
||||||
Reference in New Issue
Block a user