这是我大三的时候写在QQ空间的玩意,现在在长沙工作一年的我准备去深圳工作,在研究简历时发现需要给自己在专业的网页建个博客,于是把那时候写的几个小玩意贴上来供大家交流研究下。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#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]);
}
}