⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 k_mean.c

📁 K_mean K均值算法 C语言
💻 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 + -