数据集
链接:数据集及python代码
提取码:sp8c
python实现
模块Identify_KNN_python.py
# coding:utf-8
"""
基于KNN的数字识别--python实现
"""
import os
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import MinMaxScaler
from KNN_python import classify
def img2vector(filename):
"""
将每个文件中32*32的矩阵数据(图片),转换到1*1024一行
"""
# 创建一个1行1024列的数组
sample = np.zeros((1, 1024))
# 打开当前的文件
f = open(filename, "rb")
# 每个文件中有32行,每行有32列数据,遍历32个行,将32个列数据放入1024的列中
for i in range(32):
cur_line = f.readline()
for j in range(32):
sample[0, 32 * i + j] = int(cur_line[j])
return sample
def train_model():
labels = []
# 读取 TrainData目录下所有的文件
train_files = os.listdir('TrainData')
m = len(train_files)
# zeros((m,1024)) 返回一个m行 ,1024列的数组
X = np.zeros((m, 1024))
#获取所有的训练样本
for i in range(m):
# 获取文件名称
file_name = train_files[i]
# 获取文件除了后缀的名称
base_name = file_name.split('.')[0]
# 获取文件"数字"的类别
digit = int(base_name.split('_')[0])
labels.append(digit)
# 构建训练集, img2vector 每个文件返回一行数据 1024列
X[i] = img2vector('TrainData/%s' % file_name)
# 读取测试样本
test_files = os.listdir('TestData')
#错误样本数
error_count = 0.0
m_test = len(test_files)
for i in range(m_test):
file_name = test_files[i]
base_name = file_name.split('.')[0]
true_digit = int(base_name.split('_')[0])
sample = img2vector('TestData/%s' % file_name)
pred_digit = classify(sample.ravel(), X, labels, 3)
print("识别出的数字是: %d, 真实数字是: %d" % (pred_digit,true_digit))
if (pred_digit != true_digit):
error_count += 1.0
print("\n识别错误次数 %d" % error_count)
error_rate = error_count / float(m_test)
print("\n正确率: %f" % (1 - error_rate))
if __name__ == '__main__':
# IdentifImgClassTest()
train_model()
sklearn实现
模块Identify_KNN_sklearn.py
# coding:utf-8
"""
基于KNN的数字识别--python实现
"""
import os
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import accuracy_score
from Identify_KNN_python import img2vector
def extract_samples(dir_):
"""
dir_:给定一个目录,抽取其中的样本
return X:特征集
y:标记
"""
#训练集类别标记
y = []
# 读取 TrainData目录下所有的文件
files = os.listdir(dir_)
m = len(files)
# zeros((m,1024)) 返回一个m行 ,1024列的数组
X = np.zeros((m, 1024))
#获取所有的样本
for i in range(m):
# 获取文件名称
file_name = files[i]
# 获取文件除了后缀的名称
base_name = file_name.split('.')[0]
# 获取文件"数字"的类别
digit = int(base_name.split('_')[0])
y.append(digit)
# 构建训练集, img2vector 每个文件返回一行数据 1024列
X[i] = img2vector('TrainData/%s' % file_name)
return X,y
if __name__ == '__main__':
#抽取训练集,测试集
X_train,y_train = extract_samples("TrainData")
X_test,y_test = extract_samples("TestData")
#实例化模型
knn = KNeighborsClassifier(n_neighbors=3,weights="uniform")
knn.fit(X_train,y_train)
#预测测试样本
y_pred= knn.predict(X_test)
#准确率
acc = accuracy_score(y_test,y_pred)
print("预测准确率:",acc)