K近邻算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)); //欧氏距离

相关文档
最新文档