K近邻算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模式识别作业
K近邻算法
姓名:
班级:
学号:
二零一一年十二月
K近邻算法
一、K近邻基本描述:
K近邻就是在N个样本中,找出x 的K个近邻。设这N个样本中,来自Wc类的样本有Nc个,若K1,K2,…Kc分别是K个近邻中属于W1,W2,…,Wc类的样本数,则我们可以定义判别函数为:
g i x=k i,i=1,2,3,…,c
决策规则为:若
g j x=max
k i
i
则决策x∈w j。这就是K近邻的基本规则。
二、基本算法流程如下:
(1)取A[1]~A[k]作为x的初始临近,计算与测试样本x间的欧氏距离d(x,A[ i ]),i=1~k;
(2)按d(x,A[ i ])升序排序,计算最远样本与x间的距离D←max{ d (x,A[ j ])},j=1~k;
(3)for(i=k+1;i<=n; i++)
(4)计算A[ i ]与x间的距离d(x,A[ i ]);
(5)if d(x,A[ i ]) (6)then 用A[ i ]代替最远样本; (7)按d(x,A[ i ])升序排序,计算最远样本与x间的距离D← max{ d (x,A[ j ])},j=1~i; (8)计算前k个样本A[ i ],i=1~k所属类别的概率,具有最大概率的类别即为样本x的类。 三、实验结果: 导入iris训练样本之后得到的结果 由图可以得知我们算得的结果为第一类的聚类准确率为1.0000,第二类聚类的准确率为0.93333,第三类聚类的准确率为0.93333。总体准确率为0.93333。 四、程序源代码 #include #include #define n 60 #define k 5 struct distance { float d; intnum; } dist[n]; voidselectsort(struct distance *b) { inti,j; struct distance temp; for(i=0;i<=n-2;i++) { for(j=i+1;j<=n-1;j++) { if(b[j].d { temp=b[j]; b[j]=b[i]; b[i]=temp; } } } } int count(struct distance *a) { int i,c1=0,c2=0,c3=0; for(i=0;i { if(a[i].num==1) c1=c1+1; else if(a[i].num==2) c2=c2+1; else c3=c3+1; } for(i=0;i<20;i++) dist[i].num=1; for(i=20;i<40;i++) dist[i].num=2; for(i=40;i<60;i++) dist[i].num=3; if(c1>=(k/2+1)) return(1); else if(c2>=(k/2+1)) return(2); else if(c3>=(k/2+1)) return(3); else return(0); } void rate(inta,intb,int c) { printf("第一类的聚类正确率为%f\n",a/30.0); printf("第二类的聚类正确率为%f\n",b/30.0); printf("第三类的聚类正确率为%f\n",c/30.0); printf("总体正确率为%f\n",(a+b+c)/90.0); } void main() { int i,j,kind,c1,c2,c3; c1=c2=c3=0; float train[n][6],test[n+30][6]; for(i=0;i<20;i++) dist[i].num=1; for(i=20;i<40;i++) dist[i].num=2; for(i=40;i<60;i++) dist[i].num=3; FILE *fp; if((fp=fopen("train.txt","r"))==NULL) printf("error!\n"); for(i=0;i { for(j=0;j<6;j++) fscanf(fp,"%f",&train[i][j]); } fclose(fp); //iris训练样本导入 if((fp=fopen("test.txt","r"))==NULL) printf("error!\n"); for(i=0;i<(150-n);i++) { for(j=0;j<6;j++) fscanf(fp,"%f",&test[i][j]); } fclose(fp); //导入测试样本 for(j=0;j<90;j++) { for(i=0;i<60;i++) { dist[i].d=sqrt(pow(test[j][1]-train[i][1],2)+pow(test[j][2]-train[i][2],2)+pow(test[j][ 3]-train[i][3],2)+pow(test[j][4]-train[i][4],2)); //欧氏距离