1. 程式人生 > >KNN演算法 C++實現

KNN演算法 C++實現

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;
}