赞
踩
程序设计训练课有个大作业。。。要写大数据算法,分类聚类回归。。
像我这么菜的只学过分类算法,想了又想觉得KNN的应用又简单又高大上,然而网上的代码都是Python的,没有Python编译器的我完全无法照抄啊!(毕竟只是菜鸡大二学生)
结果还是改写了个C++版的,DevC++运行没问题,代码如下:
- #include <iostream>
- #include <algorithm>
- #include <cmath>
- using namespace std;
-
- bool trainingdata[10][160][1030];//存数据
- bool testdata[1030];
- int haha = 0;
-
- struct Distance {
- double dis;
- int lable;
- };
-
- bool mysort(Distance x,Distance y){
- return (x.dis < y.dis);
- }
-
- void img2vector(char* filename,bool* data);
- void int2str(int x,int y,char* s);
- void trainingDataSet();
- int KNN(char* filename,int k);
-
- int KNN(char* filename,int k){
- Distance D[1501];
- int cnt[10],result;
- double sum = 0;
- img2vector(filename,testdata);
- for(int i = 0;i < 10;i++) cnt[i] = 0;
- //计算测试样本与每一个训练样本的距离
- for(int i = 0;i < 10;i++){
- for(int j = 0;j < 150;j++){
- sum = 0;
- for(int m = 0;m < 1024;m++){
- sum += (trainingdata[i][j][m]^testdata[m]);
- }
- D[i*150+j].dis = sqrt(sum);
- D[i*150+j].lable = i;
- }
- }
- //按D中dis元素进行升序排序
- sort(D,D+1500,mysort);
- //选择距离最小的k个点
- for(int i = 0;i < k;i++){
- cnt[D[i].lable]++;
- }
- //求众数
- result = 0;
- for(int i = 0;i < 10;i++){
- if(cnt[i] > cnt[result]) result = i;
- }
- return result;
- }
-
- //文本向量化 32x32 -> 1x1024
- void img2vector(char* filename,bool* data){
- FILE * fp = fopen(filename,"r");
- char ch;
- int i = 0;
- while(ch = fgetc(fp)){
- if(ch == EOF) break;
- if(ch == '0'){
- *(data + i) = 0;
- i++;
- }
- else if(ch == '1'){
- *(data + i) = 1;
- i++;
- }
- }
- fclose(fp);
- }
-
- void int2str(int x,int y,char* s){
- int c = 0;
- int yy = y;
- do{
- yy /= 10;
- c++;
- }while(yy > 0);
- s[4] = x + '0';
- s[5] = '_';
- for(int i = c;i > 0;i--){
- s[5+i] = y%10 + '0';
- y /= 10;
- }
- s[6+c] = '.';
- s[7+c] = 't';
- s[8+c] = 'x';
- s[9+c] = 't';
- s[10+c] = '\0';
- }
-
- //构建训练集数据向量
- void trainingDataSet(){
- char filename[25];
- filename[0] = 't';
- filename[1] = 'r';
- filename[2] = 'a';
- filename[3] = '\\';
- for(int i = 0;i < 10;i++){//标签0-9
- for(int j = 0;j < 150;j++){//每组取150个训练数据
- int2str(i,j,filename);
- img2vector(filename,trainingdata[i][j]);
- }
- }
- }
-
- //运行KNN测试
- int main(){
- int K;
- int error_cnt = 0,ans;
- char filename[25];
- cout<<"选取最邻近的K个值,K=";
- cin>>K;
- trainingDataSet();
- filename[0] = 't';
- filename[1] = 'e';
- filename[2] = 's';
- filename[3] = '\\';
- for(int i = 0;i < 80;i++){//共80组数据,每组包含0-9
- for(int j = 0;j < 10;j++){
- int2str(j,i,filename);
- ans = KNN(filename,K);
- if(ans != j) error_cnt++;
- cout<<"第"<<i+1<<"组 预测值:"<<ans<<" 真实值:"<<j<<'\n';
- }
- cout<<'\n';
- }
- cout<<"\n测试集总数为:800";
- cout<<"\n测试出错总数为:"<<error_cnt;
- cout<<"\n错误率:"<<double(error_cnt)/8<<'%'<<endl;
- }
-
这代码完全按照网上大神的Python改的,过程都一样,普通学生党应该也可以看懂。
数据集用的是网上下载的,这一篇里有:https://www.cnblogs.com/chenbjin/p/3869745.html
(为了拿免费C币2333)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。