C 實現最基本的KNN手寫數字識別

2021-09-11 08:45:11 字數 1972 閱讀 8809

knn演算法概述:knn演算法的思想即,乙個樣本屬於其在特徵空間裡的最近鄰樣本中數目最多的分類。

該演算法有幾個關鍵要素:

一.k的取值,即選區k個最近鄰樣本中所屬最多的分類,顯然演算法的效果很大程度上取決於k的大小。

二.樣本物件之間距離的定義,一般使用歐氏距離或曼哈頓距離:

knn演算法流程

1.計算**樣本與每個訓練集樣本的距離

2.將樣本按距離從小到大排序

3.從前往後取k個樣本,統計各個標籤對應樣本數目

4.找出對於數目最多的標籤,則為測試樣本所屬分類

這裡我們選擇歐式距離來計算樣本間距離,測試不同k的取值下演算法的**精度。對mnist資料集進行一些處理,即將畫素點不為0的位置全部定義為1。因為樸素的knn演算法計算複雜度非常高,僅選用部分訓練資料和測試資料進行實驗。knn演算法並不會訓練出乙個用於分類或回歸的模型,所以每次進行**時,我們都需要打包所有的訓練資料。

#include using namespace std ;

vectorlabels;

vector>images;//訓練集

vectorlabels1;

vector>images1;//測試集

const int train_number=10000;

const int test_number=500;

int a[20];

int knn(int i,int k);

struct node

q[train_number+100];

bool cmp(node a,node b)

void read_mnist_label(string filename, vector&labels) }}

void read_mnist_images(string filename, vector>&images)

}images.push_back(tp);

} }}void read_mnist_label1(string filename, vector&labels) }}

void read_mnist_images1(string filename, vector>&images)

}images.push_back(tp);

} }}/**************以上為mnist資料集讀取部分,下面開始knn演算法**************/

void test(int k)

}return ans;

}int main()

} for (int i = 0; i < images.size(); i++) }

test(1);

test(2);

test(3);

test(4);

return 0;

}

部分測試截圖如下:

knn演算法存在幾個主要的缺點:

1.當樣本資料分布不均衡的時候,很有可能出現當輸入乙個未知樣本時,該樣本的k個鄰居中大數量類的樣本占多數,但是這類樣本並不接近目標樣本(就像下圖的y點),會被誤判為藍色分類。針對此類情況,可以採用距離加權的優化演算法,即距離越近的樣本對應分類獲得更大的全權值。

2.資料量龐大時,計算複雜度過高。執行一次knn演算法,需要遍歷一遍所有資料集。可以採用資料結構優化的辦法,常見的有k-d數和球樹等優化。

Tensorflow實現DNN,手寫數字識別

from tensorflow.examples tutorials mnist import input data mnist input data.read data sets g tensorflow data one hot true import tensorflow as tf lear...

kNN實現手寫數字識別系統

總結 from numpy import import operator from os import listdir import numpy as np 向量化,對每個32 32的數字向量化為1 1024 def img2vector filename returnvect zeros 1,10...

教你用TensorFlow實現手寫數字識別

弱者用淚水安慰自己,強者用汗水磨練自己。這段時間因為專案中有一塊需要用到影象識別,最近就一直在煉丹,寶寶心裡苦,但是寶寶不說。能點開這篇文章的朋友估計也已經對tensorflow有了一定了解,至少知道這是個什麼東西,我也就不過多介紹了。實現手寫數字識別幾乎是所有入手影象識別的入門程式了,tensor...