#knn介紹 更多參考百度介紹算法
算法思想:給定一個帶標檢的訓練數據集(就是帶分類結果的樣本),對於一個新的輸入實例,咱們在訓練數據集中以某種距離度量方式找出與該輸入實例距離最近鄰的k個實例。
找出這k個實例(這也是knn中k的含義)中類別出現最多的那個類別,最後咱們就將該新的輸入實例劃分爲此類別
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)
#下面測試一張新的照片app
#獲取外部的一張數字圖片,讓模型進行分類 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 未知分類的數據
#模型保存和運用dom
#保存模型 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