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;


}

所使用的编译软件是c-free 5 CJY版 ,编译所使用的数据

可以QQ向我要,我也是新手,大家可以交流。1369471989


0 0
原创粉丝点击