当前位置:   article > 正文

基于KNN的手写体数字识别的C++程序实现_手写汉字特征提取c++

手写汉字特征提取c++
最近在写一个大作业,需要用c/c++实现基于KNN的一个小程序,在网上找了找发现大部分都是用python实现的,所以我就收集了一下其他大佬已经写好的素材并进行一部分的修改。基本可以实现需要的所有要求,如有不足欢迎大家提出来进行修正。
实现功能:手写体数字识别
算法:KNN
语言:C/C++
编译工具:VS2017

数据集:train-images-idx3-ubyte.gz   train-labels-idx1-ubyte.gz 
http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz(官方数据集下载地址)

话不多说:
二值化处理后的28*28图片数据集:

作为有监督学习首先定义数字结构体用于存储一个子结构和标签:
/*一个手写数字的结构体*/
typedef struct
{
 int pixel[1024];
 int label;
}Digit;

/*一个有label的距离结构体*/
typedef struct
{
 float distance;
 int label;
}Distance;

加载数据集的实现:
int loadDigit(Digit *digit, FILE *fp, int *labels)
/*读取digit*/
{
 int index = 0;
 for (index = 0; index<784; index++)
 {
  if (!fscanf(fp, "%d", &(digit->pixel[index])))
  {
   printf("FILE already read finish.\n");
   return -1;
  }
 }
 fscanf(fp, "%d", &(digit->label));
 *labels = digit->label;

 return 1;
}

计算欧氏距离代码:

float calDistance(Digit digit1, Digit digit2)

{

int i, squareSum = 0.0;

for (i = 0; i<1024; i++)

{

squareSum += pow(digit1.pixel[i] - digit2.pixel[i], 2.0);

}

return sqrtf(squareSum);

}
用选择排序排序算法对欧式距离进行排序:

void exchange(Distance *in, int index1, int index2)
/*交换字符串两项*/
{
 Distance tmp = (Distance)in[index1];
 in[index1] = in[index2];
 in[index2] = tmp;
}

void selectSort(Distance *in, int length)
/*选择排序*/
{
 int i, j, min;
 int N = length;
 for (i = 0; i<N - 1; i++)
 {
  min = i;
  for (j = i + 1; j<N; j++)
  {
   if (in[j].distance<in[min].distance) min = j;
  }
  exchange(in, i, min);
 }
}


预测结构字代码实现:

int prediction(int K, Digit in, Digit *train, int nt)/*利用训练数据预测一个数据digit*/

{

int i, it;

Distance distance[1133];

for (it = 0; it<nt; it++)

{

distance[it].distance = calDistance(in, train[it]);

distance[it].label = train[it].label;

}

int predict = 0;

int b0[10] = { 0 };

 

selectSort(distance, nt);

for (i = 0; i<K; i++)

{

switch (distance[i].label)

{

case 0:

b0[0]++;

break;

case 1:

b0[1]++;

break;

case 2:

b0[2]++;

break;

case 3:

b0[3]++;

break;

case 4:

b0[4]++;

break;

case 5:

b0[5]++;

break;

case 6:

b0[6]++;

break;

case 7:

b0[7]++;

break;

case 8:

b0[8]++;

break;

case 9:

b0[9]++;

break;

default:

break;

}

}

int max = 0;

for (int m = 0; m < 10; m++) {

if (b0[m] >= max) {

max = b0[m];

predict = m;

}

}

return predict;

}
50个预测值:

当K值取1时模型训练的准确率为:
召回率:
混淆矩阵:




源码下载地址:https://download.csdn.net/download/qq_41910473/10483097
数据集下载地址:https://download.csdn.net/download/qq_41910473/10483113
mnist数据集官方地址:http://yann.lecun.com/exdb/mnist/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/357214
推荐阅读
相关标签
  

闽ICP备14008679号