#include<stdio.h>
#include<math.h>
#define AttSetSize 2
#define n 8
#define k 2
double DIstance(double DataBase[],double ClusterCenter[]){
int i;
double distance=0;
for(i=0;i<AttSetSize;i++){
distance+=(DataBase[i]-ClusterCenter[i])*(DataBase[i]-ClusterCenter[i]);
}
distance=sqrt(distance);
return distance;
}
main()
{
double ClusterCenter[k][AttSetSize]; //簇中心对象
double DataBase[n][AttSetSize]={{1,1},{2,1},{1,2},{2,2},{4,3},{5,3},{4,4},{5,4}}; //原始数据对象
int i,j;
int objectCluster[n]; //数据的簇分类的编号
double sim;
int ClusterNo=-1; // 簇标号
bool HasChanged=true;
//选择初始簇中心
for(i=0;i<k;i++){
for(j=0;j<AttSetSize;j++)
{
ClusterCenter[i][j]=DataBase[i][j]; //取前面k个对象
}
printf("第%d个初始簇中心为:(%f,%f)\n",i,ClusterCenter[i][0],ClusterCenter[i][1]);
}
//将数据分配进入簇
while(HasChanged){
for(j=0;j<n;j++){ //对象的序号的循环
double sim=1000;
for(i=0;i<k;i++){ //簇的循环,判断与那个簇距离更近
if(DIstance(DataBase[j],ClusterCenter[i])<sim){
sim =DIstance(DataBase[j],ClusterCenter[i]);
ClusterNo=i;
}
}
objectCluster[j]=ClusterNo; //对数据簇分类后,标记序号
printf("对象序号为%d初始分配进入簇%d\n",j+1 ,objectCluster[j]+1);
}
//簇的更新
for(i=0;i<k;i++)
{
double temp0=0;
double temp1=0;
int num=0;
printf("\n The Current Custer No is %d:\n",i);
for(j=0;j<n;j++){ //对象个数的循环
if(objectCluster[j]==i){ //判断是哪组簇
num++;
temp0=temp0+DataBase[j][0];
temp1=temp1+DataBase[j][1];
printf("第%d个对象的属性为:%f,%f\n",j+1,DataBase[j][0],DataBase[j][1]);
// printf("DataBase[j][0]:%f\nDataBase[j][1]:%f\n",DataBase[j][0],DataBase[j][1]);
// printf("temp0,1:%f,%f\n",temp0,temp1);
}
}
temp0=temp0/num;
temp1=temp1/num;
if(ClusterCenter[i][0]==temp0&&ClusterCenter[i][1]==temp1){
HasChanged=false;
}
ClusterCenter[i][0]=temp0;
ClusterCenter[i][1]=temp1;
}
}
//结果的输出
for(i=0;i<k;i++)
{
printf("输出第%d个簇的对象:",i+1);
for(j=0;j<n;j++)
if(objectCluster[j]==i) printf("%d ",j+1);
printf("\n");
printf("\t\t\t簇平均值为(%f,%f)\n",ClusterCenter[i][0],ClusterCenter[i][1]);
}
}
转载于:https://my.oschina.net/u/2414082/blog/477753