#knn介绍 更多参考百度介绍
import numpy as np # bmp 图片后缀 import matplotlib.pyplot as plt from sklearn.neighbors import KNeighborsClassifier img_path = './data/3/3_100.bmp' arr_img = plt.imread(img_path) arr_img.shape #维度 #特征必须是二维 feature = [] #特征 target = [] #目标数据 for i in range(10): for j in range(1,501): #img_path = './data/'+str(i)+'/'+str(i)+'_'+str(j)+'.bmp' #将图片数据读取到了numpy img_arr = plt.imread('./data/%d/%d_%d.bmp'%(i,i,j)) #格式化替换 feature.append(img_arr) target.append(i) #将列表转numpy feature = np.array(feature) feature.shape #发现feature是三维,必须变形成二维的才可以作为特征数据 #获取了符合要求的特征数据(二维) feature = feature.reshape((5000,784)) target = target #将样本集拆分成训练数据和测试数据 np.random.seed(6) np.random.shuffle(feature) np.random.seed(6) np.random.shuffle(target) #训练数据 x_train = feature[0:4950] y_train = target[0:4950] #测试数据 x_test = feature[4950:] y_test = target[4950:] x_train.shape #训练形状 knn = KNeighborsClassifier(n_neighbors=15) knn.fit(x_train,y_train) #试数据 knn.score(x_test,y_test) #评分 print('模型分类结果:',knn.predict(x_test)) print('真实分类:',y_test)
#下面测试一张新的照片
#获取外部的一张数字图片,让模型进行分类 digist_img_arr = plt.imread('./数字.jpg') digist_img_arr.shape plt.imshow(digist_img_arr) five_img_arr = digist_img_arr[95:150,90:125] #图片切割 行/列 plt.imshow(five_img_arr) #检查切分出图片(即将被模型进行分类的图片)的形状 five_img_arr.shape #(55, 35, 3) #将图片的第三个维度删除(降维) five_img_arr = five_img_arr.mean(axis=2) #任意的聚合方法都能降维 0-x 1-y 2-z five_img_arr.shape #对不满足像素要求的图片进行等比例压缩 import scipy.ndimage as ndimage five_img_arr = ndimage.zoom(five_img_arr,zoom=(28/55,28/35)) #图片压缩 five_img_arr.shape #(28, 28) five_img_arr = five_img_arr.reshape((1,784)) #1行784列 five_img_arr.shape #(1,784) knn.predict(five_img_arr)[0] #X 未知分类的数据
#模型保存和运用
#保存模型 from sklearn.externals import joblib joblib.dump(knn,'./knn.m') #写入模型 value, filename, compress=0, protocol=None, cache_size=None kknn = joblib.load('./knn.m') #读取模型 kknn对象 print(kknn) #KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', #metric_params=None, n_jobs=1, n_neighbors=15, p=2, #weights='uniform') kknn.predict(five_img_arr)[0] #测试模型 结果5