【最新】C语言代码模式识别——最大最小距离分类法.docx
《【最新】C语言代码模式识别——最大最小距离分类法.docx》由会员分享,可在线阅读,更多相关《【最新】C语言代码模式识别——最大最小距离分类法.docx(3页珍藏版)》请在冰豆网上搜索。
![【最新】C语言代码模式识别——最大最小距离分类法.docx](https://file1.bdocx.com/fileroot1/2022-10/2/27247d67-6580-4d86-b26d-1c59e33ead66/27247d67-6580-4d86-b26d-1c59e33ead661.gif)
#include
#include
#defineC0.5
main(void)
{
intx[100][3],z[100][3],b[100];//x[][]输入点坐标z[][]:
标记第几个聚类中
心;w[][]用于标记各点到聚类中心距离最小值
inti,j,h,N,flag,k=1,f=1;//f:
聚类中心个数;b[]用于记录与聚类中心最大距离的
点标号;dd[][]:
在循环体中记录各点与聚类中心距离
floatw[100][100],dd[100][100],Q,max1,max2,distance[100];//distance[]:
记并求
出录第二个聚类点
b[0]=0;
printf("最大最小距离分类法\n\n");
printf("请输入坐标数N");
scanf("%d",&N);
printf("请输入各点的坐标:
\n");
for(i=0;i{
x[i][0]=i+1;//x[0[0]=1,x[1][0]=2...
for(j=1;j<=2;j++)//x数组为三列数组其中第一列用来编号记录个点编号从1
开始x1,x2。
如x[3][3]={{1,0,0},{2,3,8},{3,2,2}}
scanf("%d",&x[i][j]);
}
printf("输入的点为\n");
for(i=0;i{
printf("x%d:
",x[i][0]);
printf("{%d,%d}",x[i][1],x[i][2]);
}
z[0][0]=x[0][0],z[0][1]=x[0][1],z[0][2]=x[0][2];
printf("\n取输入的第一个点为第一聚类中心
z%d:
{%d,%d}\n",x[0][0],x[0][1],x[0][2]);
for(i=0;i{
distance[i]=sqrt((x[i][1]-z[0][1])*(x[i][1]-z[0][1])+(x[i][2]-z[0][2])*(x[i]
[2]-z[0][2]));
printf("第%d个点(%d,%d)到z%d(%d,%d)的距离
是%f\n",(i+1),x[i][1],x[i][2],z[0][0],z[0][1],z[0][2],distance[i]);
}
max1=distance[0];
for(j=0;j<=N;j++)
{
if(distance[j]>max1)
{max1=distance[j];
flag=j;}
}
b[f]=flag;
printf("到z%d{%d,%d}距离最远的点(既聚类点)是
(%d,%d)\n",z[0][0],z[0][1],z[0][2],x[flag][1],x[flag][2]);
Q=C*max1;
printf("阈值Q是%f\n",Q);
while(k!
=0)
{
for(j=0;j<=f;j++)
{
printf("各点到各聚类中心距离为\n");
for(i=0;i{
for(j=0;j<=f;j++)
{
dd[i][j]=(float)sqrt((x[i][1]-x[b[j]][1])*(x[i][1]-x[b[j]][1])+(x[i][2]-x[b[
j]][2])*(x[i][2]-x[b[j]][2]));
printf("%f",dd[i][j]);
}printf("\n");
}
}
for(i=0;i{w[i][0]=dd[i][0];
for(j=0;j<=f;j++)
{
if(w[i][0]>=dd[i][j])//if(w[i][0]>dd[i][j]不对这样会导致最后打印不
出第一类的各点
{w[i][0]=dd[i][j];
w[i][2]=j;}
}
w[i][1]=i;
}
printf("各坐标点到聚类中心最小距离是\n");
for(i=0;iprintf("%f\n",w[i][0]);
max2=w[0][0];
for(i=0;i{
if(max2{max2=w[i][0];
h=i;}
}
if(max2>Q)
{
f=f+1;
b[f]=h;
printf("\n由于到聚类中心距离中有比阈值大的新聚类中心产生");
printf("x%d:
{%d,%d}\n",h+1,x[h][1],x[h][2]);
}
else
{
printf("各坐标点到聚类中心距离均小于阈值%f,分类结束\n",Q);
k=0;
printf("一共产生%d类聚类中心\n",f+1);
for(i=0;i<=f;i++)
{printf("第%d类聚类中心包含坐标有",i+1);
for(j=0;j{
if(w[j][2]==i)
{printf("x%d:
(%d,%d)",j+1,x[j][1],x[j][2]);}
}
printf("\n");
}
}
}
}