您的位置:首页 > 编程语言 > C语言/C++

KNN算法 C++实现

2016-04-03 22:02 316 查看
KNN是分类方法,对于可以计算距离的样本,给出已经分好类的样本和K值,计算待检测数据是属于哪一类.

距离用的欧式距离,求前k个距离最小的值,我的时间复杂度是O(n logn),查资料堆排序可以O(Klogn)。

测试数据来自http://download.csdn.net/download/qq_16267353/7520631

#include <iostream>

#include <vector>

#include <sstream>

#include <fstream>

#include <math.h>

#include <algorithm>

#include <string>

using namespace std;

struct Node{
double dis;
double label;
Node(){}
Node(double d,int l):dis(d),label(l){}

};

bool cmp(Node a,Node b){
return a.dis<b.dis;

}

vector<vector<double>> readData(ifstream& in){
vector<vector<double>> data;
istringstream str;
string s;
vector<double> item;
while(getline(in,s)){
str.str(s);
double tmp;
while(str>> tmp){
item.push_back(tmp);
}
data.push_back(item);
item.clear();
str.clear();
}
return data;

}

Node getDis(vector<double> a, vector<double> b){
int len = a.size();
int len2 = b.size();
Node node;
node.label = a[len-1];
if(len-1 != len2){
return node;
}else{
double dis=0;
for(int i=0;i<len2;i++){
dis+= pow(a[i]-b[i],2.0);
}
dis = sqrt(dis);
node.dis = dis;
return node;
}

}

int main(){
vector<Node> nodes;
ifstream in("data.txt");
if(!in){
cout <<"error opening"<<" data.txt"<<endl;
exit(-1);
}
vector<vector<double>> data;
data = readData(in); 
int len = data[0].size(); 
vector<double> testdata;
Node node;

int k;
while(true){
int label[10]={0};
cout << "输入待分类数据"<<endl;
for(int i = 0 ; i < len-1;i++){
double tep;
cin >> tep;
testdata.push_back(tep);
}
for(size_t i=0;i<data.size();i++){  //计算与每一个点的距离
   node= getDis(data[i],testdata);
nodes.push_back(node);

   sort(nodes.begin(),nodes.end(),cmp);

        cout << "输入k的值 ";
cin>>k;
for(int i=0;i<k;i++){
label[int(nodes[i].label)]++;
}
int max=0;
int l=0;
for(int i=0;i<k;i++){
if(max<label[i]){

               l=i;
  max=label[i];
}   
}
cout<<l<<endl;



system("pause");
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习