📄 k_mean.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void initiate();
void given_center();
void classify();
void cal_center();
int compare_center();
void show_result();
//全局变量
int data[20][2]; //样本点数据
int S1[20][2] ,S2[20][2]; //聚类
float NewCenter1[1][2] , NewCenter2[1][2]; //一次分类后产生的聚类中心点
float OldCenter1[1][2], OldCenter2[1][2]; //一次分类前产生的聚类中心点
int num1,num2;
void main()
{
initiate();
given_center(); //给定初次聚类中心
num1=num2=0; //两组聚类数初始化
for (;compare_center()==1;) //如果前后两次聚类中心相同
{
classify(); //对数据进行分类
cal_center(); //计算聚类中心
compare_center(); //比较聚类中心
show_result(); //输出结果
if(compare_center()==1)
break;
}
}
void initiate()
{//输入样本点数据,存放在data数组
data[0][0]=0;data[0][1]=0;data[1][0]=1;data[1][1]=0;data[2][0]=0;data[2][1]=1;data[3][0]=1;data[3][1]=1;data[4][0]=2;data[4][1]=1;data[5][0]=1;data[5][1]=2;data[6][0]=2;data[6][1]=2;data[7][0]=3;data[7][1]=2;data[8][0]=6;data[8][1]=6;data[9][0]=7;data[9][1]=6;
data[10][0]=8;data[10][1]=6;data[11][0]=6;data[11][1]=7;data[12][0]=7;data[12][1]=7;data[13][0]=8;data[13][1]=7;data[14][0]=9;data[14][1]=7;data[15][0]=7;data[15][1]=8;data[16][0]=8;data[16][1]=8;data[17][0]=9;data[17][1]=8;data[18][0]=8;data[18][1]=9;data[19][0]=9;data[19][1]=9;
}
void given_center()
{
OldCenter1[0][0]=data[0][0]; OldCenter1[0][1]=data[0][1];
OldCenter2[0][0]=data[9][0]; OldCenter2[0][1]=data[9][1]; //聚类中心赋初值
}
void classify() //给样本点分为2类
{
int x,y,a,i,j;
float r,r1,r2,z1,z2;
x=y=a=i=j=0; num1=num2=0; r=r1=r2=z1=z2=0.000000;
for(a=0;a<19;a++)
{
z1=OldCenter1[0][0];
z2=OldCenter1[0][1]; //第一类聚类中心坐标
x=data[a][0];
y=data[a][1]; //待分类数据坐标
r=(x-z1)*(x-z1)+(y-z2)*(y-z2);
r1=sqrt(r); //与一类距离
z1=OldCenter2[0][0];
z2=OldCenter2[0][1]; //第二类聚类中心坐标
r=(x-z1)*(x-z1)+(y-z2)*(y-z2);
r2=sqrt(r); //与二类距离
if(r1<r2)
{ S1[i][0]=x;
S1[i][1]=y;
i=i+1;
num1=num1+1; //S1数组的赋值,i为数组里样本点的个数
}
else
{ S2[j][0]=x;
S2[j][1]=y;
j=j+1;
num2=num2+1; //S2数组的赋值,j为数组里样本点个数
}
}
i=j=0;
}
void cal_center()
{
float sum_x,sum_y;
int num;
sum_x=sum_y=0;
num=0;
for(num=0;num<num1;num++)
{
sum_x=sum_x+S1[num][0];
sum_y=sum_y+S1[num][1];
}
NewCenter1[0][0]=sum_x/num1;
NewCenter1[0][1]=sum_y/num1; //第一类聚类新中心
sum_x=sum_y=0;
num=0;
for(num=0;num<num2;num++)
{
sum_x=sum_x+S2[num][0];
sum_y=sum_y+S2[num][1];
}
NewCenter2[0][0]=sum_x/num2;
NewCenter2[0][1]=sum_y/num2; //第二类聚类新中心
}
int compare_center()
{
int flag;
if(NewCenter1[0][0]==OldCenter1[0][0])
{
flag=1;
}
else
{
flag=0;
OldCenter1[0][0]=NewCenter1[0][0];
OldCenter1[0][1]=NewCenter1[0][1];
OldCenter2[0][0]=NewCenter2[0][0];
OldCenter2[0][1]=NewCenter2[0][1];//比较新旧两个聚类中心是否相同,相同返回值1
}
return flag;
}
void show_result()
{
printf("\n第1类聚类成员数目:%d",num1);
printf("\n第1组聚类中心坐标:%10f,%10f",NewCenter1[0][0],NewCenter1[0][1]);
printf("\n第2类聚类成员数目:%d",num2);
printf("\n第2组聚类中心坐标:%10f,%10f",NewCenter2[0][0],NewCenter2[0][1]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -