文章目录
操作平台: windows10, python37, jupyter
数据下载: https://www.lanzous.com/iae2wyh
1、读取数据
- 这些数据全部都是图片,从0~9,一个数字共500张,并且每个数字图片都在对应的文件夹下,以
自身值_序号.bmp
的方式进行命名,如图:
● data文件夹下:
● 0文件夹下:
1.1、导入相关库
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
%matplotlib inline
1.2、读取一张图片测试
img = plt.imread('./data/0/0_1.bmp')
plt.imshow(img,cmap = plt.cm.gray) #这些图片都是黑白的,
1.3、读取所有图片
data = []
for i in range(10):
for j in range(1,501):
data.append(plt.imread('./data/%d/%d_%d.bmp'%(i,i,j)))
查看data大小:
len(data)
5000
2、数据预处理
2.1、list转numpy
- 上面得到的data是list类型,但是图片是用维度的,需要把它的数据还原。
# 数据
X = np.array(data)
X.shape
(5000, 28, 28)
2.2、添加对应数字
- 上面得到的信息只是图片本身的数据,但是却不明确是哪个数字,所以必须给它指定,并赋值给 y。
(1)构造数组
y = [0,1,2,3,4,5,6,7,8,9]*500
y
结果:从0-9,0-9,0-9,一共500次。总共有5000个数值。
(2)数组转numpy
y = np.array(y)
y
array([0, 1, 2, ..., 7, 8, 9])
(3)排序
- 因为上面的data是每一个文件夹分别读取的,一样的数值就在一起了,前500个全是0, 第二个500全是1… …,我们只需要y排序就可以对应它的值了。
y.sort()
y
array([0, 0, 0, ..., 9, 9, 9])
3、随机抽取训练集与测试集
- 随机抽样,不影响算法,算法根据距离来进行
- 训练集和测试集可能会被重复抽取到
index = np.random.randint(0,5000,size = 4000)#随机抽取80%来训练
X_train = X[index]
y_train = y[index]
index = np.random.randint(0,5000,size = 1000) #随机抽取20%来测试
X_test = X[index]
y_test = y[index]
(1)查看数据形状
结果分析: x的训练集和y的训练集数据维度不能对应,x是3维的,y属于1维的,必须要把它统一维度才能进行运算,接下了对x进行降维处理。
(2)降维处理
- 每张图片的分辨率都是28*28,相乘等于784
X_train.reshape(4000,784)
array([[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
...,
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
4、训练模型并预测
4.1、训练模型
%%time
knn = KNeighborsClassifier(n_neighbors=5)#邻近值个数为5
knn.fit(X_train.reshape(4000,-1),y_train) #如果不想计算出28*28=784,可以直接用-1代替784
Wall time: 1.97 s
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=5, p=2,
weights='uniform')
4.2、预测
%%time #耗时Wall time: 12.1 s
# 预测
y_ = knn.predict(X_test.reshape(1000,784))
查看前20个结果:
4.3、计算准确率
(1)方法一
(y_test == y_).mean()
0.931
(2)方法二
knn.score(X_test.reshape(1000,-1),y_test)
0.931
4.4、精确度调整
%%time
# n_neighbors=邻近值,weights=权重, p = 距离,n_jobs=线程
knn = KNeighborsClassifier(n_neighbors=5,weights='distance', p = 1,n_jobs=-1)
knn.fit(X_train.reshape(4000,-1),y_train) #训练模型
# predict ,计算准确率
knn.score(X_test.reshape(1000,-1),y_test)
Wall time: 3.88 s
0.953
5、识别某张图片
5.1、读取图片
img = plt.imread('./data/9/9_1.bmp') #随便读取一张图片
plt.imshow(img,cmap = plt.cm.gray) #展示
plt.show()
5.2、识别数字
knn.predict(img.reshape(1,-1))[0]
9