📄 c均值法聚类分析.cpp
字号:
#include<iostream.h>
#include<math.h>
#include<stdlib.h>
#define number 5 //矢量的个数
void main()
{double distance1,distance2,x[2][2],sum=0,a[number][2],s=0,n,q,b[2][2];
long i,j,m,cn=0,count=0,w1[100],w2[100],flag=1,set=0,set1=0;
cout<<"请给定初始的两个聚类中心:"<<endl; //输入初始的两个聚类中心
for(i=0;i<2;i++)
{for(j=0;j<2;j++)
cin>>x[i][j];
cout<<";"<<endl;
}
cout<<"输入初始聚类中心结束!"<<endl;
cout<<endl;
/***************************************************************************/
for(i=0;i<2;i++) //保存新的聚类中心
{for(j=0;j<2;j++)
b[i][j]=0;
}
/***************************************************************************/
cout<<"请输入每个矢量的样本值:"<<endl;
for(i=0;i<number;i++) //输入每个矢量的样本值
{
for(j=0;j<2;j++)
{
cin>>a[i][j];
}
cout<<";"<<endl;
cout<<endl;
if(i<number-1)
cout<<"please input another date:"<<endl;
}
cout<<"待分类矢量输入完成!"<<endl;
cout<<endl;
/***************************************************************************/
while(flag) //计算欧式距离
{
for(m=0;m<number;m++)
{for(j=0;j<2;j++)
{
q=x[0][j]-a[m][j];
n=x[1][j]-a[m][j];
q=q*q;
n=n*n;
sum=q+sum;
s=s+n;
}
distance1=pow(sum,0.5);
distance2=pow(s,0.5);
if(distance1<distance2) //比较距离的大小,确定此矢量属于哪一模式
{
w1[cn]=m;
cn++;
}
else
{w2[count]=m;
count++;
}
s=0;
sum=0;
}
/***************************************************************************/
for(i=0;i<cn;i++) //计算新的聚类中心
{m=w1[i];
b[0][0]=a[m][0]+b[0][0];
b[0][1]=a[m][1]+b[0][1];
set=1;
}
if(set==1)
{b[0][0]=b[0][0]/cn;
b[0][1]=b[0][1]/cn;
}
for(i=0;i<count;i++)
{m=w2[i];
b[1][0]=a[m][0]+b[1][0];
b[1][1]=a[m][1]+b[1][1];
set1=1;
}
if(set1==1)
{b[1][0]=b[1][0]/count;
b[1][1]=b[1][1]/count;
}
/***************************************************************************/
if(x[0][0]==b[0][0]&&x[0][1]==b[0][1]&&x[1][0]==b[1][0]&&x[1][1]==b[1][1])
{
cout<<"输出最后的聚类中心:"<<endl; //判断是否完成每个矢量的模式分类
for(i=0;i<2;i++)
{for(j=0;j<2;j++)
cout<<b[i][j]<<endl;
cout<<";"<<endl;
}
cout<<endl;
cout<<"输出最后模式分类的结果:"<<endl;
cout<<endl;
cout<<"属于w1的矢量有:"<<endl;
for(i=0;i<cn;i++)
{ w1[i]=w1[i]+1;
cout<<w1[i]<<endl;
}
cout<<";"<<endl;
cout<<"属于w2的矢量有:"<<endl;
for(i=0;i<count;i++)
{ w2[i]=w2[i]+1;
cout<<w2[i]<<endl;
}
cout<<";"<<endl;
flag=0;
}
else //没有则重新替代聚类中心值,返回重新计算
{
x[0][0]=b[0][0];
x[0][1]=b[0][1];
x[1][0]=b[1][0];
x[1][1]=b[1][1];
flag=1;
for(i=0;i<2;i++)
{for(j=0;j<2;j++)
b[i][j]=0;
}
cn=0;
count=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -