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

KNN算法的编程步骤

文件data.txt中的数据为:



1. c++读取txt 文件到数组中的程序
#include<iostream>
#include<fstream>
using namespace std;

#define maxRow 12
#define maxCol  2

ifstream fin;  //定义ifstream 类的对象:fin
ofstream fout; //定义ofstream类的对象:fout
int 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 2

typedef 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

































评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值