KNN項目實戰——手寫數字識別
1、 介紹
k近鄰法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一種基本分類與回歸方法。它的工作原理是:存在一個樣本數據集合,也稱作為訓練樣本集,並且樣本集中每個數據都存在標簽,即我們知道樣本集中每一個數據與所屬分類的對應關系。輸入沒有標簽的新數據后,將新的數據的每個特征與樣本集中數據對應的特征進行比較,然后算法提取樣本最相似數據(最近鄰)的分類標簽。一般來說,我們只選擇樣本數據集中前k個最相似的數據,這就是k-近鄰算法中k的出處,通常k是不大於20的整數。最后,選擇k個最相似數據中出現次數最多的分類,作為新數據的分類。
2、數據集介紹
32X32 文本格式數據.

3、代碼實現
3.1、導包
import numpy as np import pandas as pd import matplotlib.pylab as plt %matplotlib inline
import os
3.2、讀取訓練數據
# 獲取數據文件 fileList = os.listdir('./data/trainingDigits/') # 定義數據標簽列表 trainingIndex = []
# 添加數據標簽 for filename in fileList: trainingIndex.append(int(filename.split('_')[0])) # 定義矩陣數據格式 trainingData = np.zeros((len(trainingIndex),1024)) trainingData.shape
#(3868, 1024)
# 獲取矩陣數據 index = 0 for filename in fileList: with open('./data/trainingDigits/%s'%filename, 'rb') as f: # 定義一個空矩陣 vect = np.zeros((1,1024)) # 循環32行 for i in range(32): # 讀取每一行數據 line = f.readline() # 遍歷每行數據索引 line[j] 即為數據 for j in range(32): vect[0,32*i+j] = int(line[j]) trainingData[index,:] = vect index+=1
3.3、讀取測試數據
fileList2 = os.listdir('./data/testDigits/') # 定義數據標簽列表 testIndex = []
# 獲取數據標簽 for filename2 in fileList2: testIndex.append(int(filename2.split('_')[0])) #讀取測試數據 # 定義矩陣數據格式 testData = np.zeros((len(testIndex),1024)) testData.shape #(946, 1024) # 獲取矩陣數據 index = 0 for filename2 in fileList2: with open('./data/testDigits/%s'%filename2, 'rb') as f: # 定義一個空矩陣 vect = np.zeros((1,1024)) # 循環32行 for i in range(32): # 讀取每一行數據 line = f.readline() # 遍歷每行數據索引 line[j] 即為數據 for j in range(32): vect[0,32*i+j] = int(line[j]) testData[index,:] = vect index+=1
3.5、數據建模
from sklearn.neighbors import KNeighborsClassifier # 定義 k 為5個, 即 尋找最近的3個鄰居 knn = KNeighborsClassifier(n_neighbors=3) # 訓練數據 knn.fit(trainingData,trainingIndex)
3.6、分析數據
%%time # 預測數據 predict_data = knn.predict(testData) # Wall time: 7.8 s
knn.score(testData,testIndex)
#0.9862579281183932
# 識別正確率: 98.626%
