文中数据下载
识别分析: 图片是二维的数组
图片原始数据
plt.imread('./digits/0/0_1.bmp')
array([[255, 255,
255, 255],
[255, 255,
255, 255]], dtype=uint8)
可以看出是一个二维数据, 但根据实际情况每行样本的列并不是样本的多个特征
根据实际情况,每个图片是一个样本,样本中的所有数据都是样本的特征
所以我们将每张图片做一下处理,将shape为28x28的改变为 1x784 的 数据 这样就可以进行K-邻近算法分类预测
图片预处理后的数据
data = data.flatten() #将图片数据转为一维的
data
array([255, 255, 255, 255, 255], dtype=uint8)
一、数据预处理
1)创建训练数据集与测试数据集
# 训练数据集
X_train = []
y_train = []
# 测试数据集
X_test = []
y_test = []
2)导入数据
已知图片数据为 0-9的图片数字,分别在名字为0-9的文件夹中分别有500个,我们将前490个作为训练集,490之后为训练集
for i in range(10):
for j in range(1,501):
# print('./digits/%d/%d_%d.bmp'%(i,i,j))
# 根据路径 读取数据 然后 把28*28的形状 变成1行的形状
data = plt.imread('./digits/%d/%d_%d.bmp'%(i,i,j)).flatten()
# 目标值就是 文件夹的名字 也就在i
target = i
# 前490个都用来训练 后10个用来测试
if j<=490: # 将前490个作为训练集
X_train.append(data)
y_train.append(target)
else: # 将490个之后的作为测试集
X_test.append(data)
y_test.append(target)
这样我们就取到了训练集与测试集
二、创建数据模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
三、模型训练
knn.fit(X_train,y_train)
四、模型预测
y_ = knn.predict(X_test)
五、预测结果展示
1)预测准确率
knn.score(X_test,y_test)
0.94
2)预测结果绘图
plt.figure(figsize=(15,15)) #设置画布大小
index = 1
for i in range(10):
for j in range(10):
axes = plt.subplot(10,10,index) #建立子画布
# 传入测试数据 按照索引从X_test中获取数据 然后变回28*28的形状
plt.imshow(X_test[index-1].reshape(28,28)) #将测试图片的数据恢复到图片显示的形状
axes.axis('off') # 隐藏坐标轴
# 把真实数据作为坐标系的标题
axes.set_title(y_[index-1]) # 将子画布的标题设置为测试结果值
index += 1
可以看出识别率是非常不错的
六、知识点总结
- 图片分类的处理
flatten()将数据扁平化
K近邻算法 处理分类问题
- from sklearn.neighbors import KNeighborsClassifier
·knn = KNeighborsClassifier()
·