KNN (K近鄰算法) - 識別手寫數字


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%

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM