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容器中元素的排序
完整的程序:
#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