KNN算法 C++实现
2016-04-03 22:02
357 查看
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;
}
距离用的欧式距离,求前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;
}
相关文章推荐
- 用Python从零实现贝叶斯分类器的机器学习的教程
- My Machine Learning
- 机器学习---学习首页 3ff0
- 反向传播(Backpropagation)算法的数学原理
- 也谈 机器学习到底有没有用 ?
- 如何用70行代码实现深度神经网络算法
- 量子计算机编程原理简介 和 机器学习
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)
- 已经证实提高机器学习模型准确率的八大方法
- 初识机器学习算法有哪些?
- 机器学习相关的库和工具
- 10个关于人工智能和机器学习的有趣开源项目
- 机器学习实践中应避免的7种常见错误
- 机器学习书单
- 北美常用的机器学习/自然语言处理/语音处理经典书籍
- 如何提升COBOL系统代码分析效率
- 自动编程体系设想(一)
- 自动编程体系设想(一)
- 支持向量机(SVM)算法概述
- [Ng机器学习公开课1]机器学习概述