当前位置:   article > 正文

K-近邻(KNN)算法识别手写数字的C++实现_knn算法实验报告c++

knn算法实验报告c++

程序设计训练课有个大作业。。。要写大数据算法,分类聚类回归。。

像我这么菜的只学过分类算法,想了又想觉得KNN的应用又简单又高大上,然而网上的代码都是Python的,没有Python编译器的我完全无法照抄啊!(毕竟只是菜鸡大二学生)

结果还是改写了个C++版的,DevC++运行没问题,代码如下:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cmath>
  4. using namespace std;
  5. bool trainingdata[10][160][1030];//存数据
  6. bool testdata[1030];
  7. int haha = 0;
  8. struct Distance {
  9. double dis;
  10. int lable;
  11. };
  12. bool mysort(Distance x,Distance y){
  13. return (x.dis < y.dis);
  14. }
  15. void img2vector(char* filename,bool* data);
  16. void int2str(int x,int y,char* s);
  17. void trainingDataSet();
  18. int KNN(char* filename,int k);
  19. int KNN(char* filename,int k){
  20. Distance D[1501];
  21. int cnt[10],result;
  22. double sum = 0;
  23. img2vector(filename,testdata);
  24. for(int i = 0;i < 10;i++) cnt[i] = 0;
  25. //计算测试样本与每一个训练样本的距离
  26. for(int i = 0;i < 10;i++){
  27. for(int j = 0;j < 150;j++){
  28. sum = 0;
  29. for(int m = 0;m < 1024;m++){
  30. sum += (trainingdata[i][j][m]^testdata[m]);
  31. }
  32. D[i*150+j].dis = sqrt(sum);
  33. D[i*150+j].lable = i;
  34. }
  35. }
  36. //按D中dis元素进行升序排序
  37. sort(D,D+1500,mysort);
  38. //选择距离最小的k个点
  39. for(int i = 0;i < k;i++){
  40. cnt[D[i].lable]++;
  41. }
  42. //求众数
  43. result = 0;
  44. for(int i = 0;i < 10;i++){
  45. if(cnt[i] > cnt[result]) result = i;
  46. }
  47. return result;
  48. }
  49. //文本向量化 32x32 -> 1x1024
  50. void img2vector(char* filename,bool* data){
  51. FILE * fp = fopen(filename,"r");
  52. char ch;
  53. int i = 0;
  54. while(ch = fgetc(fp)){
  55. if(ch == EOF) break;
  56. if(ch == '0'){
  57. *(data + i) = 0;
  58. i++;
  59. }
  60. else if(ch == '1'){
  61. *(data + i) = 1;
  62. i++;
  63. }
  64. }
  65. fclose(fp);
  66. }
  67. void int2str(int x,int y,char* s){
  68. int c = 0;
  69. int yy = y;
  70. do{
  71. yy /= 10;
  72. c++;
  73. }while(yy > 0);
  74. s[4] = x + '0';
  75. s[5] = '_';
  76. for(int i = c;i > 0;i--){
  77. s[5+i] = y%10 + '0';
  78. y /= 10;
  79. }
  80. s[6+c] = '.';
  81. s[7+c] = 't';
  82. s[8+c] = 'x';
  83. s[9+c] = 't';
  84. s[10+c] = '\0';
  85. }
  86. //构建训练集数据向量
  87. void trainingDataSet(){
  88. char filename[25];
  89. filename[0] = 't';
  90. filename[1] = 'r';
  91. filename[2] = 'a';
  92. filename[3] = '\\';
  93. for(int i = 0;i < 10;i++){//标签0-9
  94. for(int j = 0;j < 150;j++){//每组取150个训练数据
  95. int2str(i,j,filename);
  96. img2vector(filename,trainingdata[i][j]);
  97. }
  98. }
  99. }
  100. //运行KNN测试
  101. int main(){
  102. int K;
  103. int error_cnt = 0,ans;
  104. char filename[25];
  105. cout<<"选取最邻近的K个值,K=";
  106. cin>>K;
  107. trainingDataSet();
  108. filename[0] = 't';
  109. filename[1] = 'e';
  110. filename[2] = 's';
  111. filename[3] = '\\';
  112. for(int i = 0;i < 80;i++){//共80组数据,每组包含0-9
  113. for(int j = 0;j < 10;j++){
  114. int2str(j,i,filename);
  115. ans = KNN(filename,K);
  116. if(ans != j) error_cnt++;
  117. cout<<"第"<<i+1<<"组 预测值:"<<ans<<" 真实值:"<<j<<'\n';
  118. }
  119. cout<<'\n';
  120. }
  121. cout<<"\n测试集总数为:800";
  122. cout<<"\n测试出错总数为:"<<error_cnt;
  123. cout<<"\n错误率:"<<double(error_cnt)/8<<'%'<<endl;
  124. }

这代码完全按照网上大神的Python改的,过程都一样,普通学生党应该也可以看懂。

数据集用的是网上下载的,这一篇里有:https://www.cnblogs.com/chenbjin/p/3869745.html

(为了拿免费C币2333)

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

闽ICP备14008679号