/***************************************
* 1.初始化距离为最大值
* 2.计算未知样本和每个训练样本的距离为dist
* 3.得到目前k个最邻近样本中的最大距离maxdist
* 4.如果dist小于maxdist,则将改训练样本作为k-最近邻样本
* 5.重复2、3、4,直至未知样本和训练样本的距离都算完
* 6.统计k个最近邻样本中每个类别出现的次数
* 7.选择出现频率最大的类别作为未知样本的类别
* *****************************************/#include#include#include#include
#define MAX 0x7fffffff
#define K 3
double cal_dist(int n,double *x,double *y)
{double sum = 0.0;int i =0;for(i=0;i
{
sum+= pow((x[i]-y[i]),2.0);
}returnsqrt(sum);
}void bubbleSort(double **array,int count,intflag)
{int i =count,j;doubletemp;while(i>0)
{for(j=0;j
{if(flag == 0)
{if(array[0][j] > array[0][j+1])
{
temp= array[0][j];
array[0][j] = array[0][j+1];
array[0][j+1] =temp;
temp= array[1][j];
array[1][j] = array[1][j+1];
array[1][j+1] =temp;
}
}else if(flag == 1)
{if(array[1][j] > array[1][j+1])
{
temp= array[1][j];
array[1][j] = array[1][j+1];
array[1][j+1] =temp;
temp= array[0][j];
array[0][j] = array[0][j+1];
array[0][j+1] =temp;
}
}
}
i--;
}return;
}intmain()
{intn,m;
FILE*fp;
fp= fopen("/data.txt","r");
fscanf(fp,"N=%d,D=%d",&n,&m);
printf("N=%d,D=%d",n,m);double **array;
array= (double **)malloc(n*sizeof(double));
array[0] = (double *)malloc(n*m*sizeof(double));int h,j = 0,i =0;for(i=1;i
{
array[i]= array[i-1] +m;
}for(i=0;i
{for(j=0;j
{
fscanf(fp,"%lf",&array[i][j]);
}
}double **temp;
temp= (double **)malloc(2*sizeof(double));
temp[0] = (double *)malloc(2*K*sizeof(double));for(i=1;i<2;i++)
{
temp[i]= temp[i-1] +K;
}for(i=0;i<2;i++)
{for(j=0;j
{
temp[i][j]= MAX*0.1;
}
}double *testdata;double max_dist = 0.0;double distance = 0.0;double tmp = 0.0;
testdata=(double *)malloc((m-1)*sizeof(double));
printf("input test data containing %d numbers:",m-1);for(i=0;i
{
fscanf(fp,"%lf",&testdata[i]);
}
close(fp);while(1)
{for(i=0;i
{if(K > n) break;
temp[0][i] =cal_dist(n,testdata,array[i]);
temp[1][i] = array[i][m-1];
}for(i=0;i
{
printf("%4lf,%4lf",temp[0][i],temp[1][i]);
}
printf("");
bubbleSort(temp,K,0);
max_dist= temp[0][K-1];for(i=K;i
{
distance=cal_dist(n,testdata,array[i]);if(max_dist >distance)
{for(j=0;j
{if(distance < temp[0][j])
{for(h=K-1;h>j;h--)
{
temp[0][h] = temp[0][h-1];
temp[1][h] = temp[1][h-1];
}
}
temp[0][j] =distance;
temp[1][j] = array[i][m-1];
}
}
max_dist= temp[0][K-1];
}
bubbleSort(temp,K,1);break;
}int value_label = 0;int count = 0;int flag = 0;for(i=0;i
{if(temp[1][i] != temp[1][i+1])
{if(flag >count)
{
flag=count;
value_label= temp[1][i];
count=1;
}
}else{
count++;
}
}if(count >flag)
{
value_label= temp[1][K-1];
flag=count;
}
printf("Predict message is %d",value_label);return 0;
}