已知有20个样本,每个样本有2个特征,数据分布如下图: 样本序号 特征x1 特征x2 x11 8 6 x1 0 0 x2 x3 x4 x5 x6 x7 x8 x9 x10 1 0 0 1 1 1 2 1 1 2 2 2 3 2 6 6 7 6 x12 x13 x14 x15 x16 x17 x18 x19 x20 6 7 7 7 8 7 9 7 7 8 8 8 9 8 8 9 9 9 用K次平均算法分成2类,编程上机,并画出分类图。
C程序代码: #include //主程序 void main() { double x[20][2]={{0,0},{1,0},{0,1},{1,1},{2,1},{1,2},{2,2},{3,2},{6,6},{7,6},{8,6},{6,7},{7,7},{8,7},{9,7},{7,8},{8,8},{9,8},{8,9},{9,9}}; int label[20]; Kaverage(x,label); /调用k均值子函数 } //将b数组的值赋给a数组 void copy(double a[],double b[]) { int i=2; for(i=0;i<2;i++) { a[i]=b[i]; } } //将a、b两数组的值对应相加 void add(double a[],double b[]) { a[0]=a[0]+b[0]; a[1]=a[1]+b[1]; } //对比a、b两数组,若a=b返回1,否则返回0 int compare(double a[],double b[]) { if(a[0]==b[0]&&a[1]==b[1]) return 1; else return 0; } //计算a和b的欧式距离 double distance(double a[],double b[]) { return (sqrt((a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]))); } //k均值子程序 void Kaverage(double x[20][2],int label[]) //label[i]表示x[i]标签(1或2) { double centre1[2]={0,0},centre2[2]={0,0}; copy(centre1,x[0]); copy(centre2,x[9]);//初始聚类中心为x1和x10,将x[9]代之以x[1] int j=1; while(j>0) { int i; int N1=0,N2=0; for(i=0;i<20;i++) { if(distance(x[i],centre1)>=distance(x[i],centre2)) { label[i]=2; N2=N2+1; } else { label[i]=1; N1=N1+1; } } double new1[2]={0,0},new2[2]={0,0}; for(i=0;i<20;i++) { if(label[i]==1) add(new1,x[i]); else add(new2,x[i]); } new1[0]=new1[0]/N1; new1[1]=new1[1]/N1; new2[0]=new2[0]/N2; new2[1]=new2[1]/N2; if(compare(new1,centre1)==1&&compare(new2,centre2)==1) break; else { copy(centre1,new1); copy(centre2,new2); } j++; } printf(\"centre1=%f,%f\\n\ printf(\"centre2=%f,%f\\n\ int i; printf(\"聚类中心为centre1=%f,%f的有\\n\ for(i=0;i<20;i++) if(label[i]==1) printf(\"x[%d]\\n\ printf(\"聚类中心为centre2=%f,%f的有\\n\ for(i=0;i<20;i++) if(label[i]==2) printf(\"x[%d]\\n\} 运行结果: 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo2.com 版权所有 湘ICP备2023021991号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务