knn算法c语言实现,C语言实现knn

/***************************************

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

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值