KNN算法---c++实现KNN算法

来源:互联网 发布:dede cms 排行榜文章 编辑:程序博客网 时间:2024/06/06 02:10

KNN算法的编程步骤

文件data.txt中的数据为:



1. c++读取txt 文件到数组中的程序
#include<iostream>#include<fstream>using namespace std;#define maxRow 12#define maxCol  2ifstream fin;  //定义ifstream 类的对象:finofstream fout; //定义ofstream类的对象:foutint main(){    fin.open("D:/data.txt");    if(!fin )    {        cout<<"could not open the file"<<endl;        return -1;    }    fout.open("D:/test.txt");    if(!fout)    {        cout<<"could not open the file"<<endl;        return -1;    }    float data[maxRow][maxCol];    char labels[maxRow];    //循环把 data.txt 中的内容 输入到数组中    for(int i=0;i<12;i++)    {        for(int j = 0;j<2;j++)        {          fin>>data[i][j];        }        fin>>labels[i];    }    //循环把 数组中的内容输出到文件test.txt中    for(int i=0;i<12;i++)    {      for(int j = 0;j<2;j++)        {          fout<<data[i][j]<<"  ";        }        fout<<" "<<labels[i]<<endl;    }    fin.close();    //关闭文件 data.txt    fout.close();   //关闭文件 test.txt    return 0; }
上面的程序可以把我们需要的数据读入到程序中数组中,如何把数组数据和标签的数据建立联系呢?我们通过C++中的map容器把数据和标签建立关系。

2. c++中vector、map容器的基本用法
vector相当于一个动态数组。
int main(){    vector<int> a;   //vector 创建一维数组    a.push_back(1); // 在容器 a 的尾部插入一个元素 2    a.push_back(2);    a.push_back(3);    a.pop_back();    //在容器 的尾部删除一个元素        //遍历输出 vector    vector<int>::iterator itr;    for(itr = a.begin();itr!= a.end();itr++)    {        cout<< *itr<<"\t";    }    return 0;}
vector容器中元素的排序


map 是一类关联是容器,自动建立 key - value 的对应关系,我们需要对map 中的值进行排序,所以就建立存有 map 类型的vector容器,然后用sort 排序。


完整的程序:
#include<iostream>#include<map>#include<vector>#include<stdio.h>#include<cmath>#include<algorithm>#include<fstream>#include<cstdlib>using namespace std;#define maxRow 12#define maxCol 2typedef pair<int,double> PAIR;ifstream fin;class KNN{private:    int k;    double dataSet[maxRow][maxCol];    char   labels[maxRow];    double testData[maxCol];    map<int,double> map_index_dis;    map<char,int> map_label;    double get_distance(double* dt1,double* dt2);public:    KNN();    void get_all_distance();    void get_max_fre_label();    void show();    struct CmpByValue    {        bool operator() (const PAIR& lhs,const PAIR& rhs)        {            return lhs.second < rhs.second;        }    };};void KNN::show(){    map<int,double>::iterator it;    for( it=map_index_dis.begin();it!= map_index_dis.end();it++)    {        cout<<"index = "<<it->first<<"  value = "<<it->second<<endl;    }}KNN::KNN(){  fin.open("d:\\data.txt", ios::in);    if(!fin)    {        cout<<"can nod load the file"<<endl;;        exit(1);    }   for(int i=0;i<maxRow;i++)   {       for(int j=0;j<maxCol;j++)       {           fin>>dataSet[i][j];       }       fin>>labels[i];   }   cout<<"输入测试数据:";   for(int n=0;n<maxCol;n++)   {       cin>>testData[n];   }   cout<<endl;   cout<<"输入 k 的值:";   cin>>k;}double KNN::get_distance(double* dt1,double* dt2){    double sum = 0;    for(int i=0;i<maxCol;i++)    {        sum += pow((dt1[i]-dt2[i]),2);    }    return (sqrt(sum));}void KNN::get_all_distance(){    double distance;    for(int i=0;i<maxRow;i++)    {        distance = get_distance(dataSet[i],testData);        map_index_dis[i] = distance ;    }}void KNN::get_max_fre_label(){   vector<pair<int,double>> vec_index_dis( map_index_dis.begin(),map_index_dis.end());   sort(vec_index_dis.begin(), vec_index_dis.end(), CmpByValue());   cout<<"前"<< k<<"个最小数据排序为:"<<endl;   for(int i=0;i<k;i++)   {      cout<<"index = "<<vec_index_dis[i].first<<" the distance= "<<vec_index_dis[i].second          <<" the label = "<<labels[vec_index_dis[i].first]          <<" the coordinate("<<dataSet[vec_index_dis[i].first][0]<<","          <<dataSet[vec_index_dis[i].first][0]<<")"<<endl;      map_label[labels[vec_index_dis[i].first]]++;   }    map<char,int>::iterator itr = map_label.begin();    int max_freq = 0;    char label;    while(itr != map_label.end())    {        if(itr->second > max_freq)        {            max_freq = itr->second;            label = itr->first;        }        itr++;    }    cout<<"数据属于标签:"<<endl;    cout<<"label = "<<label<<endl;}int main(){    KNN knn;    knn.get_all_distance();    knn.show();    knn.get_max_fre_label();    fin.close();    getchar();    return 0;}
结果显示:



参考:
http://blog.csdn.net/lavorange/article/details/16924705

































原创粉丝点击