使用根據knn原理寫的MNIST數字識別

我在CSDN上發的第一篇博客就是關於使用Python實現MNIST數字識別的,使用了sklearn庫,沒具體關心原理,這篇博文鏈接在這裏(不知道爲什麼CSDN有時候老是加載不出頁面來),從此我入了機器學習的坑。沒想到有不少人看到了並向我要源碼,現在看當時寫的程序,因爲對Python瞭解不夠深入,導致很多地方的操作效率都很低。現在再發一篇關於knn實現手寫數字識別的,這次用的是我自己手寫的數字,與MNIST有點不一樣,就不寫很詳細的解釋了,如果有人看到了有什麼問題可以在評論區評論,我儘可能及時回覆。當然了knn對MNIST分類效果並不好,而且很慢,在Kaggle上有人使用神經網絡可以達到99.9%的正確率了。下邊是代碼,詳細請看註釋。 

import numpy as np
import cv2
def testOne(n):
    test_img = cv2.imread(r"test_30/img"+str(n)+".png", 0)  #自己手寫的圖片,圖片名都是img_n.jpg,n是圖片的真實標籤減1,當時寫圖片的時候沒處理好。
    test_img = cv2.pyrDown(cv2.pyrDown(cv2.pyrDown(test_img))) #縮小圖片尺寸
    test_img[test_img < 127] = 1 #使矩陣中每個小於127的值賦值爲1
    test_img[test_img >= 127] = 0#使矩陣中每個小於127的值賦值爲0
    # 上邊的兩句話順序不可以顛倒
    test_img=np.reshape(test_img,[1225,1]) #每個圖片都展開成一維向量
    # print(test_img.shape)
    train_img=np.load("trainIMG.npy") # 這裏提前處理好了訓練樣本的矩陣,一共有100個樣本,矩陣shape爲[1225,100]
    train_lbl=np.load("trainLabels.npy") # 這是提前處理好的訓練標籤的矩陣[100,]
    # print(train_img.shape)
    # print(train_lbl.shape)
    distance=np.sum(np.square(train_img - test_img),axis=0) # 計算距離,不是必須開方的,節省運算
    # distance = np.sqrt(np.sum(np.square(train_img - test_img),axis=0))
    k=7
    args=np.argsort(distance)[:k] # 先對距離排序再挑選前k個距離最小值的數據下標
    # print(args)
    print(train_lbl[args]) # 找到訓練標籤裏相對應下標的數據,就是前k個距離最小的標籤了
    count=np.bincount(train_lbl[args]) # bincount方法可以百度一下,這裏就是爲了統計前k個距離最小標籤(0-9數字)中每類(每個數字)的個數。
    # print(count)
    result=np.argmax(count) # 挑選出個數最多的那一類(那個數字,就是前k個最小距離樣本標籤中數目最多的那個標籤了,這就是那個結果)
    return result
Result=np.zeros([30],dtype=np.int)
for i in range(30):
    Result[i]=testOne(i+1) # 這裏i+1是爲了和圖片名匹配
print(Result)
res=np.ones([30],dtype=np.int)
for i in range(30):
    res[i]=Result[i]-i%10 # 這裏是爲了計算準確率,結果爲0的表示預測數字與真實數字一致,不爲0的表示不一致
print(res)
correct=np.where(res!=0)[0]
print("正確率:{:.4}%".format((1-correct.shape[0]/30)*100))

下邊的截圖是我的全部測試樣本。 

下邊是我的部分訓練樣本截圖。

好吧其實區別不大………………

貌似沒法在博客裏傳附件……只能上傳到資源裏邊 ……資源分數竟然能不能設爲0……好吧我也是醉了。資源鏈接:https://download.csdn.net/download/zugexiaodui/10802762

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章