KNN算法的实现 ,假设K=4
来源:互联网 发布:单片机烧录器制作 编辑:程序博客网 时间:2024/06/16 09:13
#include <iostream>
#include <string>
#include <fstream>
#include <math.h>
#include <cstdlib>
using namespace std;
//结构体数组
struct structdis
{
//保存待测花朵到所有样本数据的距离
double distance ;
//花朵所在的类别
string classfic ;
};
//比较K个节点中最多的种类是哪个,并输出
void compare(int Irissetosaconut,int Irisversicolorcount,int Irisvirginicacount)
{
int max=0; //最多种类的数量
string maxname=""; // 最多种类的名称
if (Irissetosaconut>Irisversicolorcount)
{
max=Irissetosaconut;
maxname="Iris-setosa";
}
else
{
max=Irisversicolorcount;
maxname="Iris-versicolor";
}
if(max<Irisvirginicacount)
{
max=Irisvirginicacount;
maxname="Iris-virginica ";
}
std::cout<<maxname<<endl;
}
//结构体进行交换赋值,使用指针
void Swap(structdis * array1, structdis * array2)
{
structdis tmp;
tmp = *array1;
*array1 = *array2;
*array2= tmp;
}
//堆的建立过程 ,大堆
void MinHeapify(structdis array[], int heapSize, int currentNode)
{
int leftChild, rightChild, minimum;
leftChild = 2*currentNode + 1;
rightChild = 2*currentNode + 2;
if(leftChild < heapSize && array[leftChild].distance > array[currentNode].distance)
minimum = leftChild;
else
minimum = currentNode;
if(rightChild < heapSize && array[rightChild].distance > array[minimum].distance)
minimum = rightChild;
if(minimum != currentNode)
{
Swap(&array[minimum], &array[currentNode]);
MinHeapify(array, heapSize, minimum);
}
}
/*构建大根堆*/
void MinHeapCreat(structdis array[], int heapSize)
{
int i;
for(i = heapSize/2; i >= 0; i--)
{
MinHeapify(array, heapSize, i);
}
}
//堆的调整的过程
void Adjust(structdis array[],int top, int j)//从j=K+1个节点开始调整进入堆
{
while(array[top].distance>array[j].distance)// 当待排的数据比大根堆的根的距离值大,就替换掉
{
Swap(&array[top],&array[j]);
MinHeapify(array, 4, top);
++j;
}
}
int main (void )
{
int i,Datalen=-1,len=-1; // i 为循环变量,Datalen 为数组长度
string Data[1000],Data1[1000];// 存储数据
//读取样本数据
ifstream fin("d:\\1.txt");
if( ! fin )
{
cerr<<"Can not open file."<<endl;
getchar();
return 1;
}
while (!fin.eof())
{
++Datalen;
fin>>Data[Datalen];
}
string s [Datalen][5];
for(int i=0;i<Datalen;i++)
for (int j=0;j<5;j++)
{
int pos=Data[i].find(',');
s[i][j]=Data[i].substr(0,pos);
Data[i]=Data[i].substr(pos+1,Data[i].length());
//cout<<s[i][j]<<endl;
}
//读取待测数据
ifstream fin1("d:\\0.txt");
if( ! fin1 )
{
cerr<<"Can not open file."<<endl;
getchar();
return 1;
}
len=-1;
while (!fin1.eof())
{
++len;
fin1>>Data[len];
}
string s1 [len][4];
for(int i=0;i<len;i++)
for (int j=0;j<4;j++)
{
int pos=Data[i].find(',');
s1[i][j]=Data[i].substr(0,pos);
Data[i]=Data[i].substr(pos+1,Data[i].length());
//cout<<s1[i][j]<<endl;
}
//计算距离
structdis Dis[Datalen],temp[4];
int maxcount;
for(int j=0;j<len;j++)
{
for (int i=0;i<Datalen;i++)
{
double a,b,c,d;
a=atof(s[i][0].c_str())-atof(s1[j][0].c_str());
b=atof(s[i][1].c_str())-atof(s1[j][1].c_str());
c=atof(s[i][2].c_str())-atof(s1[j][2].c_str());
d=atof(s[i][3].c_str())-atof(s1[j][3].c_str());
Dis[i].distance=sqrt(a*a+b*b+c*c+d*d);
Dis[i].classfic=s[i][4];
//cout<<Dis[i].distance<< Dis[i].classfic<<endl;
}
//根据距离构造堆
MinHeapCreat(Dis,4); // 默认k的值为4,先对4个数据进行测试,建堆,
Adjust(Dis,0,5) ;
int Irissetosaconut=0,Irisversicolorcount=0,Irisvirginicacount=0; //种类的数量
// 利用剩余的数据与这四个数据进行比较,选出最小的四个
for(int i=0;i<4;i++)
{
//cout<<Dis[i].distance;
//cout<< Dis[i].classfic<<endl;
if( Dis[i].classfic=="Iris-setosa") Irissetosaconut++;
else if( Dis[i].classfic=="Iris-versicolor")Irisversicolorcount++;
else Irisvirginicacount++;
}
cout<< Irissetosaconut<<Irisversicolorcount<< Irisvirginicacount<<endl;
compare(Irissetosaconut,Irisversicolorcount, Irisvirginicacount);
}
return 0;
#include <string>
#include <fstream>
#include <math.h>
#include <cstdlib>
using namespace std;
//结构体数组
struct structdis
{
//保存待测花朵到所有样本数据的距离
double distance ;
//花朵所在的类别
string classfic ;
};
//比较K个节点中最多的种类是哪个,并输出
void compare(int Irissetosaconut,int Irisversicolorcount,int Irisvirginicacount)
{
int max=0; //最多种类的数量
string maxname=""; // 最多种类的名称
if (Irissetosaconut>Irisversicolorcount)
{
max=Irissetosaconut;
maxname="Iris-setosa";
}
else
{
max=Irisversicolorcount;
maxname="Iris-versicolor";
}
if(max<Irisvirginicacount)
{
max=Irisvirginicacount;
maxname="Iris-virginica ";
}
std::cout<<maxname<<endl;
}
//结构体进行交换赋值,使用指针
void Swap(structdis * array1, structdis * array2)
{
structdis tmp;
tmp = *array1;
*array1 = *array2;
*array2= tmp;
}
//堆的建立过程 ,大堆
void MinHeapify(structdis array[], int heapSize, int currentNode)
{
int leftChild, rightChild, minimum;
leftChild = 2*currentNode + 1;
rightChild = 2*currentNode + 2;
if(leftChild < heapSize && array[leftChild].distance > array[currentNode].distance)
minimum = leftChild;
else
minimum = currentNode;
if(rightChild < heapSize && array[rightChild].distance > array[minimum].distance)
minimum = rightChild;
if(minimum != currentNode)
{
Swap(&array[minimum], &array[currentNode]);
MinHeapify(array, heapSize, minimum);
}
}
/*构建大根堆*/
void MinHeapCreat(structdis array[], int heapSize)
{
int i;
for(i = heapSize/2; i >= 0; i--)
{
MinHeapify(array, heapSize, i);
}
}
//堆的调整的过程
void Adjust(structdis array[],int top, int j)//从j=K+1个节点开始调整进入堆
{
while(array[top].distance>array[j].distance)// 当待排的数据比大根堆的根的距离值大,就替换掉
{
Swap(&array[top],&array[j]);
MinHeapify(array, 4, top);
++j;
}
}
int main (void )
{
int i,Datalen=-1,len=-1; // i 为循环变量,Datalen 为数组长度
string Data[1000],Data1[1000];// 存储数据
//读取样本数据
ifstream fin("d:\\1.txt");
if( ! fin )
{
cerr<<"Can not open file."<<endl;
getchar();
return 1;
}
while (!fin.eof())
{
++Datalen;
fin>>Data[Datalen];
}
string s [Datalen][5];
for(int i=0;i<Datalen;i++)
for (int j=0;j<5;j++)
{
int pos=Data[i].find(',');
s[i][j]=Data[i].substr(0,pos);
Data[i]=Data[i].substr(pos+1,Data[i].length());
//cout<<s[i][j]<<endl;
}
//读取待测数据
ifstream fin1("d:\\0.txt");
if( ! fin1 )
{
cerr<<"Can not open file."<<endl;
getchar();
return 1;
}
len=-1;
while (!fin1.eof())
{
++len;
fin1>>Data[len];
}
string s1 [len][4];
for(int i=0;i<len;i++)
for (int j=0;j<4;j++)
{
int pos=Data[i].find(',');
s1[i][j]=Data[i].substr(0,pos);
Data[i]=Data[i].substr(pos+1,Data[i].length());
//cout<<s1[i][j]<<endl;
}
//计算距离
structdis Dis[Datalen],temp[4];
int maxcount;
for(int j=0;j<len;j++)
{
for (int i=0;i<Datalen;i++)
{
double a,b,c,d;
a=atof(s[i][0].c_str())-atof(s1[j][0].c_str());
b=atof(s[i][1].c_str())-atof(s1[j][1].c_str());
c=atof(s[i][2].c_str())-atof(s1[j][2].c_str());
d=atof(s[i][3].c_str())-atof(s1[j][3].c_str());
Dis[i].distance=sqrt(a*a+b*b+c*c+d*d);
Dis[i].classfic=s[i][4];
//cout<<Dis[i].distance<< Dis[i].classfic<<endl;
}
//根据距离构造堆
MinHeapCreat(Dis,4); // 默认k的值为4,先对4个数据进行测试,建堆,
Adjust(Dis,0,5) ;
int Irissetosaconut=0,Irisversicolorcount=0,Irisvirginicacount=0; //种类的数量
// 利用剩余的数据与这四个数据进行比较,选出最小的四个
for(int i=0;i<4;i++)
{
//cout<<Dis[i].distance;
//cout<< Dis[i].classfic<<endl;
if( Dis[i].classfic=="Iris-setosa") Irissetosaconut++;
else if( Dis[i].classfic=="Iris-versicolor")Irisversicolorcount++;
else Irisvirginicacount++;
}
cout<< Irissetosaconut<<Irisversicolorcount<< Irisvirginicacount<<endl;
compare(Irissetosaconut,Irisversicolorcount, Irisvirginicacount);
}
return 0;
}
所使用的编译软件是c-free 5 CJY版 ,编译所使用的数据
可以QQ向我要,我也是新手,大家可以交流。1369471989
0 0
- KNN算法的实现 ,假设K=4
- KNN(K Nearest Neighbor)算法的MatLab实现
- 数据挖掘:K最近邻(KNN)算法的java实现
- 数据挖掘:K最近邻(KNN)算法的java实现
- 数据挖掘:K最近邻(KNN)算法的java实现
- k近邻算法(knn)的c语言实现
- 最简单的K近邻算法 KNN python实现
- KNN(K最临近算法)的python实现
- K近邻算法(knn)及R实现
- KNN(K-Nearest Neighbor)算法Matlab实现
- K-近邻算法(kNN)python实现
- k-邻近算法kNN及其python实现
- K近邻(KNN)算法---Python实现(一)
- knn K近邻算法python实现
- KNN算法的实现
- KNN算法的实现
- KNN算法的实现
- 【机器学习算法-python实现】KNN-k近邻算法的实现(附源码)
- CV牛人牛事简介
- abap 字符串处理
- CreateMutex创建互斥体
- SSH框架存储显示图片
- 第五天:今日知识点(拦截器):
- KNN算法的实现 ,假设K=4
- 关于jsf标签rich:coluom有值和无值时宽度不一样新写法
- 告别码农,成为真正的程序员
- 【Caffe】简单介绍
- HDOJ 1203 I NEED A OFFER!(简单背包)
- RMAN——1
- c技巧:用指针的指针移除单链表中元素
- SQL Server架构----数据库事务
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等