当前位置:   article > 正文

K-近邻分类算法(KNN) C语言实现_在c语言上实现knn数字识别

在c语言上实现knn数字识别
  1. /* 输入:数据集
  2. 输出:键入预测数据,输出预测类别
  3. 在txt文件中修改N和D的值
  4. */
  5. #include<stdio.h>
  6. #include<math.h>
  7. #include<stdlib.h>
  8. #define K 3 //近邻数k,决定模型的拟合能力
  9. typedef float type;
  10. //动态创建二维数组
  11. type **createarray(int n,int m)
  12. {
  13. int i;
  14. type **array;
  15. array=(type **)malloc(n*sizeof(type *));
  16. array[0]=(type *)malloc(n*m*sizeof(type));
  17. for(i=1;i<n;i++) array[i]=array[i-1]+m;
  18. return array;
  19. }
  20. //读取数据,要求首行格式为 N=数据量,D=维数
  21. void loaddata(int *n,int *d,type ***array,type ***karray)
  22. {
  23. int i,j;
  24. FILE *fp;
  25. if((fp=fopen("data.txt","r"))==NULL) fprintf(stderr,"can not open data.txt!\n");
  26. if(fscanf(fp,"N=%d,D=%d",n,d)!=2) fprintf(stderr,"reading error!\n");
  27. *array=createarray(*n,*d);
  28. *karray=createarray(2,K);
  29. for(i=0;i<*n;i++)
  30. for(j=0;j<*d;j++)
  31. fscanf(fp,"%f",&(*array)[i][j]); //读取数据
  32. for(i=0;i<2;i++)
  33. for(j=0;j<K;j++)
  34. (*karray)[i][j]=9999.0; //默认的最大值
  35. if(fclose(fp)) fprintf(stderr,"can not close data.txt");
  36. }
  37. //计算欧氏距离
  38. type computedistance(int n,type *avector,type *bvector)
  39. {
  40. int i;
  41. type dist=0.0;
  42. for(i=0;i<n;i++)
  43. dist+=pow(avector[i]-bvector[i],2);
  44. return sqrt(dist);
  45. }
  46. //冒泡排序
  47. void bublesort(int n,type **a,int choice)
  48. {
  49. int i,j;
  50. type k;
  51. for(j=0;j<n;j++)
  52. for(i=0;i<n-j-1;i++){
  53. if(0==choice){
  54. if(a[0][i]>a[0][i+1]){
  55. k=a[0][i];
  56. a[0][i]=a[0][i+1];
  57. a[0][i+1]=k;
  58. k=a[1][i];
  59. a[1][i]=a[1][i+1];
  60. a[1][i+1]=k;
  61. }
  62. }
  63. else if(1==choice){
  64. if(a[1][i]>a[1][i+1]){
  65. k=a[0][i];
  66. a[0][i]=a[0][i+1];
  67. a[0][i+1]=k;
  68. k=a[1][i];
  69. a[1][i]=a[1][i+1];
  70. a[1][i+1]=k;
  71. }
  72. }
  73. }
  74. }
  75. //统计有序表中的元素个数
  76. type orderedlist(int n,type *list)
  77. {
  78. int i,count=1,maxcount=1;
  79. type value;
  80. for(i=0;i<(n-1);i++) {
  81. if(list[i]!=list[i+1]) {
  82. //printf("count of %d is value %d\n",list[i],count);
  83. if(count>maxcount){
  84. maxcount=count;
  85. value=list[i];
  86. count=1;
  87. }
  88. }
  89. else
  90. count++;
  91. }
  92. if(count>maxcount){
  93. maxcount=count;
  94. value=list[n-1];
  95. }
  96. //printf("value %f has a Maxcount:%d\n",value,maxcount);
  97. return value;
  98. }
  99. int main()
  100. {
  101. int i,j,k;
  102. int D,N; //维度,即列数;数据量,即行数
  103. type **array=NULL; //数据数组
  104. type **karray=NULL; // K近邻点的距离及其标签
  105. type *testdata; //测试数据
  106. type dist,maxdist;
  107. loaddata(&N,&D,&array,&karray);
  108. testdata=(type *)malloc((D-1)*sizeof(type));
  109. printf("input test data containing %d numbers:\n",D-1);
  110. for(i=0;i<(D-1);i++) scanf("%f",&testdata[i]);
  111. while(1){
  112. for(i=0;i<K;i++){
  113. if(K>N) exit(-1);
  114. karray[0][i]=computedistance(D-1,testdata,array[i]);
  115. karray[1][i]=array[i][D-1];
  116. //printf("first karray:%6.2f %6.0f\n",karray[0][i],karray[1][i]);
  117. }
  118. bublesort(K,karray,0);
  119. //for(i=0;i<K;i++) printf("after bublesort in first karray:%6.2f %6.0f\n",karray[0][i],karray[1][i]);
  120. maxdist=karray[0][K-1]; //初始化k近邻数组的距离最大值
  121. for(i=K;i<N;i++){
  122. dist=computedistance(D-1,testdata,array[i]);
  123. if(dist<maxdist)
  124. for(j=0;j<K;j++){
  125. if(dist<karray[0][j]){
  126. for(k=K-1;k>j;k--){ //j后元素复制到后一位,为插入做准备
  127. karray[0][k]=karray[0][k-1];
  128. karray[1][k]=karray[1][k-1];
  129. }
  130. karray[0][j]=dist; //插入到j位置
  131. karray[1][j]=array[i][D-1];
  132. //printf("i:%d karray:%6.2f %6.0f\n",i,karray[0][j],karray[1][j]);
  133. break; //不比较karray后续元素
  134. }
  135. }
  136. maxdist=karray[0][K-1];
  137. //printf("i:%d maxdist:%6.2f\n",i,maxdist);
  138. }
  139. //for(i=0;i<K;i++) printf("karray:%6.2f %6.0f\n",karray[0][i],karray[1][i]);
  140. bublesort(K,karray,1);
  141. //for(i=0;i<K;i++) printf("after bublesort in karray:%6.2f %6.0f\n",karray[0][i],karray[1][i]);
  142. printf("\nThe data has a tag: %.0f\n\n",orderedlist(K,karray[1]));
  143. printf("input test data containing %d numbers:\n",D-1);
  144. for(i=0;i<(D-1);i++) scanf("%f",&testdata[i]);
  145. }
  146. return 0;
  147. }

数据集:其中要按首行下面的数据进行修改N和D的值

  1. N=150,D=5
  2. 5.1 3.5 1.4 0.2 1
  3. 4.9 3 1.4 0.2 1
  4. 4.7 3.2 1.3 0.2 1
  5. 4.6 3.1 1.5 0.2 1
  6. 5 3.6 1.4 0.2 1
  7. 5.4 3.9 1.7 0.4 1
  8. 4.6 3.4 1.4 0.3 1
  9. 5 3.4 1.5 0.2 1
  10. 4.4 2.9 1.4 0.2 1
  11. 4.9 3.1 1.5 0.1 1
  12. 5.4 3.7 1.5 0.2 1
  13. 4.8 3.4 1.6 0.2 1
  14. 4.8 3 1.4 0.1 1
  15. 4.3 3 1.1 0.1 1
  16. 5.8 4 1.2 0.2 1
  17. 5.7 4.4 1.5 0.4 1
  18. 5.4 3.9 1.3 0.4 1
  19. 5.1 3.5 1.4 0.3 1
  20. 5.7 3.8 1.7 0.3 1
  21. 5.1 3.8 1.5 0.3 1
  22. 5.4 3.4 1.7 0.2 1
  23. 5.1 3.7 1.5 0.4 1
  24. 4.6 3.6 1 0.2 1
  25. 5.1 3.3 1.7 0.5 1
  26. 4.8 3.4 1.9 0.2 1
  27. 5 3 1.6 0.2 1
  28. 5 3.4 1.6 0.4 1
  29. 5.2 3.5 1.5 0.2 1
  30. 5.2 3.4 1.4 0.2 1
  31. 4.7 3.2 1.6 0.2 1
  32. 4.8 3.1 1.6 0.2 1
  33. 5.4 3.4 1.5 0.4 1
  34. 5.2 4.1 1.5 0.1 1
  35. 5.5 4.2 1.4 0.2 1
  36. 4.9 3.1 1.5 0.2 1
  37. 5 3.2 1.2 0.2 1
  38. 5.5 3.5 1.3 0.2 1
  39. 4.9 3.6 1.4 0.1 1
  40. 4.4 3 1.3 0.2 1
  41. 5.1 3.4 1.5 0.2 1
  42. 5 3.5 1.3 0.3 1
  43. 4.5 2.3 1.3 0.3 1
  44. 4.4 3.2 1.3 0.2 1
  45. 5 3.5 1.6 0.6 1
  46. 5.1 3.8 1.9 0.4 1
  47. 4.8 3 1.4 0.3 1
  48. 5.1 3.8 1.6 0.2 1
  49. 4.6 3.2 1.4 0.2 1
  50. 5.3 3.7 1.5 0.2 1
  51. 5 3.3 1.4 0.2 1
  52. 7 3.2 4.7 1.4 2
  53. 6.4 3.2 4.5 1.5 2
  54. 6.9 3.1 4.9 1.5 2
  55. 5.5 2.3 4 1.3 2
  56. 6.5 2.8 4.6 1.5 2
  57. 5.7 2.8 4.5 1.3 2
  58. 6.3 3.3 4.7 1.6 2
  59. 4.9 2.4 3.3 1 2
  60. 6.6 2.9 4.6 1.3 2
  61. 5.2 2.7 3.9 1.4 2
  62. 5 2 3.5 1 2
  63. 5.9 3 4.2 1.5 2
  64. 6 2.2 4 1 2
  65. 6.1 2.9 4.7 1.4 2
  66. 5.6 2.9 3.6 1.3 2
  67. 6.7 3.1 4.4 1.4 2
  68. 5.6 3 4.5 1.5 2
  69. 5.8 2.7 4.1 1 2
  70. 6.2 2.2 4.5 1.5 2
  71. 5.6 2.5 3.9 1.1 2
  72. 5.9 3.2 4.8 1.8 2
  73. 6.1 2.8 4 1.3 2
  74. 6.3 2.5 4.9 1.5 2
  75. 6.1 2.8 4.7 1.2 2
  76. 6.4 2.9 4.3 1.3 2
  77. 6.6 3 4.4 1.4 2
  78. 6.8 2.8 4.8 1.4 2
  79. 6.7 3 5 1.7 2
  80. 6 2.9 4.5 1.5 2
  81. 5.7 2.6 3.5 1 2
  82. 5.5 2.4 3.8 1.1 2
  83. 5.5 2.4 3.7 1 2
  84. 5.8 2.7 3.9 1.2 2
  85. 6 2.7 5.1 1.6 2
  86. 5.4 3 4.5 1.5 2
  87. 6 3.4 4.5 1.6 2
  88. 6.7 3.1 4.7 1.5 2
  89. 6.3 2.3 4.4 1.3 2
  90. 5.6 3 4.1 1.3 2
  91. 5.5 2.5 4 1.3 2
  92. 5.5 2.6 4.4 1.2 2
  93. 6.1 3 4.6 1.4 2
  94. 5.8 2.6 4 1.2 2
  95. 5 2.3 3.3 1 2
  96. 5.6 2.7 4.2 1.3 2
  97. 5.7 3 4.2 1.2 2
  98. 5.7 2.9 4.2 1.3 2
  99. 6.2 2.9 4.3 1.3 2
  100. 5.1 2.5 3 1.1 2
  101. 5.7 2.8 4.1 1.3 2
  102. 6.3 3.3 6 2.5 3
  103. 5.8 2.7 5.1 1.9 3
  104. 7.1 3 5.9 2.1 3
  105. 6.3 2.9 5.6 1.8 3
  106. 6.5 3 5.8 2.2 3
  107. 7.6 3 6.6 2.1 3
  108. 4.9 2.5 4.5 1.7 3
  109. 7.3 2.9 6.3 1.8 3
  110. 6.7 2.5 5.8 1.8 3
  111. 7.2 3.6 6.1 2.5 3
  112. 6.5 3.2 5.1 2 3
  113. 6.4 2.7 5.3 1.9 3
  114. 6.8 3 5.5 2.1 3
  115. 5.7 2.5 5 2 3
  116. 5.8 2.8 5.1 2.4 3
  117. 6.4 3.2 5.3 2.3 3
  118. 6.5 3 5.5 1.8 3
  119. 7.7 3.8 6.7 2.2 3
  120. 7.7 2.6 6.9 2.3 3
  121. 6 2.2 5 1.5 3
  122. 6.9 3.2 5.7 2.3 3
  123. 5.6 2.8 4.9 2 3
  124. 7.7 2.8 6.7 2 3
  125. 6.3 2.7 4.9 1.8 3
  126. 6.7 3.3 5.7 2.1 3
  127. 7.2 3.2 6 1.8 3
  128. 6.2 2.8 4.8 1.8 3
  129. 6.1 3 4.9 1.8 3
  130. 6.4 2.8 5.6 2.1 3
  131. 7.2 3 5.8 1.6 3
  132. 7.4 2.8 6.1 1.9 3
  133. 7.9 3.8 6.4 2 3
  134. 6.4 2.8 5.6 2.2 3
  135. 6.3 2.8 5.1 1.5 3
  136. 6.1 2.6 5.6 1.4 3
  137. 7.7 3 6.1 2.3 3
  138. 6.3 3.4 5.6 2.4 3
  139. 6.4 3.1 5.5 1.8 3
  140. 6 3 4.8 1.8 3
  141. 6.9 3.1 5.4 2.1 3
  142. 6.7 3.1 5.6 2.4 3
  143. 6.9 3.1 5.1 2.3 3
  144. 5.8 2.7 5.1 1.9 3
  145. 6.8 3.2 5.9 2.3 3
  146. 6.7 3.3 5.7 2.5 3
  147. 6.7 3 5.2 2.3 3
  148. 6.3 2.5 5 1.9 3
  149. 6.5 3 5.2 2 3
  150. 6.2 3.4 5.4 2.3 3
  151. 5.9 3 5.1 1.8 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/439234
推荐阅读
相关标签
  

闽ICP备14008679号