模式识别——C均值算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模式识别作业
C 均值算法
姓名: 班级: 学号:
二零一一年十二月
C 均值算法
一、算法描述:
C 均值算法的基础是误差平方和准则。 若Ni 是第 i 聚类Γi 中的样本数目,mi 是这些样本的均值,即: mi = 1 Ni y
y ∈Γ i
把Γi 中的各个样本 y 与均值mi 间的误差平方和对所有的类相加后为:
Nj
计算pj =
N j +1 Ni N i −1
||y − mj||2 j ≠ i ||y − mi||2 j=i
对于所有的 j,若 pk<=pj,则把 y 从Γi 移到Γk 中去。 重新计算 mi 和 mk 值,并修改Je 。 连续迭代 N 次Je 不改变,则停止,否则转到 2。
三、实验结果
实验结果得到 iris 样本 C 聚类的结果:第一类正确率为 0.92000,第 二类聚类的正确率为 0.50000, 第三类样本的正确率为 0.44000。 总体 的准确率为 y ∈Γ i
||y − mi||2
Je 是误差平方和聚类准则,它是样本集 Y 和类别集Ω 的函数。
二、C 均值算法基本流程:
1、 选择把 N 个样本分成 C 个聚类的初始划分,计算每个聚类的均 值m1, m2 , … ,mc 和Je 。 2、 3、 4、 5、 6、 7、 选择一个备选样本 y,设 y 现在在Γi 中。 若Ni =1,则转 2,否则继续
四、程序源代码
#include<stdio.h> #include<math.h> struct distance { float d; int n; } dist[3]; void sort(struct distance *b) { inti,j; struct distance temp; for(i=0;i<=1;i++)
{ for(j=i+1;j<=2;j++){ if(b[j].d<b[i].d) { temp=b[j]; b[j]=b[i]; b[i]=temp; } } } } void rate(inta,intb,int c) { printf("第一类的聚类正确率为%f\n",a/50.0); printf("第二类的聚类正确率为%f\n",b/50.0); printf("第三类的聚类正确率为%f\n",c/50.0); printf("总体正确率为%f\n",(a+b+c)/150.0); } void main() { int i,j,c1=0,c2=0,c3=0; float g[3][4],dat[150][6]; FILE *fp; if((fp=fopen("Data.txt","r"))==NULL) printf("error!\n"); for(i=0;i<150;i++) { for(j=0;j<6;j++) fscanf (fp,"%f",&dat[i][j]); } fclose(fp); g[0][0]=4.9;g[0][1]=3.0;g[0][2]=1.4;g[0][3]=0.2; g[1][0]=6.4;g[1][1]=3.2;g[1][2]=4.5;g[1][3]=1.5; g[2][0]=5.8;g[2][1]=2.7;g[2][2]=5.1;g[2][3]=1.9; 的取一组样本值 for(j=0;j<150;j++) { for(i=0;i<3;i++) {
//聚类中心初始化,每一类
dist[i].d=sqrt(pow(dat[j][1]-g[i][0],2)+pow(dat[j][2]-g[i][1],2)+pow(dat[j][3]-g[i][2 ],2)+pow (dat[j][4]-g[i][3],2));
dist[i].n=i+1; } sort(dist); switch(dist[0].n) { case 1:{ g[0][0]=(dat[j][1]+g[0][0])/2; g[0][1]=(dat[j][2]+g[0][1])/2; g[0][2]=(dat[j][3]+g[0][2])/2; g[0][3]=(dat[j][4]+g[0][3])/2; printf("第 %d 个样本属于第 %d 类 n",j,dist[0].n); if(j>3&&j<50) c1++; }break; case 2:{ g[1][0]=(dat[j][1]+g[1][0])/2; g[1][1]=(dat[j][2]+g[1][1])/2; g[1][2]=(dat[j][3]+g[1][2])/2; g[1][3]=(dat[j][4]+g[1][3])/2; printf("第 %d 个样本属于第 %d 类\n",j,dist[0].n); if(j>49&&j<100) c2++; }break; case 3: { g[2][0]=(dat[j][1]+g[2][0])/2; g[2][1]=(dat[j][2]+g[2][1])/2; g[2][2]=(dat[j][3]+g[2][2])/2; g[2][3]=(dat[j][4]+g[2][3])/2; printf("第 %d 个样本属于第 %d 类\n",j,dist[0].n); if(j>99&&j<150) c3++; } break; } } rate(c1,c2,c3); }
相关文档
最新文档