import numpy as np
from os import listdir # 使用listdir模块,用于访问本地文件
from sklearn import neighbors
def img2vector(file_name):
"""
将加载的32*32的图片矩阵展开成一维向量。
:param file_name: 文件路径
:return: retMat: 一维向量
"""
retMat = np.zeros([1024], int) # 定义返回的矩阵,大小为1*1024
fr = open(file_name) # 打开包含32*32大小的数字文件
lines = fr.readlines() # 读取文件的所有行
for i in range(32): # 遍历文件所有行
for j in range(32): # 并将01数字存放在retMat中
retMat[i * 32 + j] = lines[i][j]
return retMat
def read_dataset(path):
"""
加载训练数据,并将样本标签转化为one-hot向量
:param path: 文件夹路径
:return: data_set, hw_labels: 训练数据, 标签数据
"""
file_list = listdir(path) # 获取文件夹下的所有文件
num_files = len(file_list) # 统计需要读取的文件的数目
data_set = np.zeros([num_files, 1024], int) # 用于存放所有的数字文件
hw_labels = np.zeros([num_files, 10]) # 用于存放对应的one-hot标签
for file in range(num_files): # 遍历所有的文件
file_path = file_list[file] # 获取文件名称/路径
digit = int(file_path.split('_')[0]) # 通过文件名获取标签
hw_labels[file][digit] = 1.0 # 将对应的one-hot标签置1
data_set[file] = img2vector(path + '/' + file_path) # 读取文件内容
return data_set, hw_labels
if __name__ == "__main__":
'''加载训练数据'''
train_dataSet, train_hwLabels = read_dataset('Data/digits/trainingDigits')
'''构建KNN分类器'''
# KNN是一种懒惰学习法,没有学习过程,只在预测时去查找最近邻的点,数据集的输入就是构建分类器的过程。
knn = neighbors.KNeighborsClassifier(algorithm='kd_tree', n_neighbors=3)
knn.fit(train_dataSet, train_hwLabels)
'''加载测试数据'''
data_set, hw_labels = read_dataset('Data/digits/testDigits')
res = knn.predict(data_set) # 对测试集进行预测
error_num = np.sum(res != hw_labels) # 统计分类错误的数目
num = len(data_set) # 测试集的数目
print("Total num:", num, " Wrong num:",
error_num, " WrongRate:", error_num / float(num))
15. 使用KNN实现DBRHD数据集的手写识别
最新推荐文章于 2022-03-09 11:15:17 发布