更新 function.py
Gitea Actions Experiment Test / Experiment-Actions (push) Successful in 12s

This commit is contained in:
2024-10-15 16:10:45 +08:00
parent fcde9e1a69
commit fd6c9adb6b
+111 -47
View File
@@ -41,61 +41,125 @@ name = "邓龙树"
# 这里写自己的代码实现
import numpy as np
import os
from collections import Counter
import numpy as np
import os
from collections import Counter
def classify(input_vector, dataSet, labels, k=1):
"""
使用 KNN 算法对输入样本进行分类。
参数:
input_vector (ndarray): 输入的特征向量,形状为 (1, n_features)。
dataSet (ndarray): 训练集特征矩阵,形状为 (m_samples, n_features)。
labels (ndarray): 训练集标签数组,形状为 (m_samples,)。
k (int): 选择最近邻的个数,默认为 1。
返回:
int: 预测的类别标签。
"""
# 计算输入向量与训练集之间的欧氏距离
distances = np.linalg.norm(dataSet - input_vector, axis=1)
# 根据距离排序并获取索引
sorted_indices = np.argsort(distances)
# 选择距离最近的k个点
k_nearest_labels = labels[sorted_indices[:k]]
# 统计k个点中各类别的数量
count = Counter(k_nearest_labels)
# 返回数量最多的类别标签
return count.most_common(1)[0][0]
def load_dataset(directory):
"""
加载数据集中的图像,并将其转换为特征向量和标签。
参数:
directory (str): 包含图像文件的目录路径。
返回:
tuple: 包含特征矩阵 (ndarray) 和标签数组 (ndarray) 的元组。
"""
feature_list = []
label_list = []
try:
for file in os.listdir(directory):
file_path = os.path.join(directory, file)
feature_vector = img_to_vector(file_path)
label = int(file.split('_')[0])
feature_list.append(feature_vector)
label_list.append(label)
feature_matrix = np.array(feature_list)
label_array = np.array(label_list)
except Exception as e:
print(f"Error loading dataset: {e}")
return None, None
return feature_matrix, label_array
def img_to_vector(filename):
"""
将二值图像转换为向量。
参数:
filename (str): 图像文件的路径。
返回:
ndarray: 转换后的特征向量,形状为 (1024,)。
"""
try:
with open(filename, 'r') as file:
lines = file.readlines()
vector = np.array([int(char) for line in lines for char in line.strip()]).reshape(1024,)
except Exception as e:
print(f"Error converting image to vector: {e}")
return None
return vector
if __name__ == "__main__":
# 加载训练数据集
train_data, train_labels = load_dataset("trainingDigits")
if train_data is None or train_labels is None:
print("Failed to load training data.")
exit(1)
def classify(input_vector, dataSet, labels, k=1): # 设置默认值 k=1
"""使用 KNN 算法对输入样本进行分类。"""
# 计算输入向量与训练集之间的欧氏距离
distances = np.linalg.norm(dataSet - input_vector, axis=1)
# 根据距离排序并获取索引
sorted_indices = distances.argsort()
# 选择距离最近的k个点
k_nearest_labels = labels[sorted_indices[:k]]
# 统计k个点中各类别的数量
count = Counter(k_nearest_labels)
# 返回数量最多的类别标签
return count.most_common(1)[0][0]
def load_dataset(directory):
"""加载数据集中的图像,并将其转换为特征向量和标签。"""
# 初始化特征数据列表和标签列表
feature_list = []
label_list = []
# 遍历目录中的所有文件
for file in os.listdir(directory):
# 获取文件的完整路径
file_path = os.path.join(directory, file)
# 将图像文件转换为向量
feature_vector = img_to_vector(file_path)
# 将特征向量添加到列表中
feature_list.append(feature_vector)
# 获取文件名中的标签并添加到标签列表中
label_list.append(int(file.split('_')[0]))
# 将特征列表和标签列表转换为numpy数组
feature_matrix = np.array(feature_list)
label_array = np.array(label_list)
return feature_matrix, label_array
def img_to_vector(filename):
"""将二值图像转换为向量。"""
# 读取文件内容并转换为整数数组
with open(filename, 'r') as file:
lines = file.readlines()
# 将每行的数字字符转换为整数,并使用 NumPy 的 reshape 方法转换为一维数组
vector = np.array([int(char) for line in lines for char in line.strip()]).reshape(1024,)
return vector
if __name__ == "__main__":
if __name__ == "__main__":
# 以下代码可用于测试,可自行随意修改
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"
)
predicted_label = classify(
np.array([int(char) for char in test_data]).reshape(1, 1024),
train_data,