📄 1.txt
字号:
#include
#include
#define TRUE 1
#define FALSE 0
int N;//数据个数
int K;//集合个数
int * CenterIndex;//初始化质心数组的索引
double * Center;//质心集合
double * CenterCopy;//质心集合副本
double * AllData;//数据集合
double ** Cluster;//簇的集合
int * Top;//集合中元素的个数,也会用作栈处理 //随机生成k个数x(0<=x<=n-1)作为起始的质心集合
void CreateRandomArray(int n, int k,int * center)
{
int i=0;
int j=0;
srand( (unsigned)time( NULL ) );
for( i=0;i=i)//如果不重复,加入
center[i]=a;
else i--;//如果重复,本次重新随机生成 }
} //返回距离最小的质心的序号
int GetIndex(double value,double * center)
{
int i=0;
int index=i;//最小的质心序号
double min=fabs(value-center[i]);//距质心最小距离
for(i=0;i0)//如果该簇元素不为空
Center[i]=sum/Top[i];//求其平均值
}
}
int IsEqual(double * center1 ,double * center2)//判断2数组元素是否相等
{
int i;
for(i=0;iN)
{
exit(0);
}
Center=(double *)malloc(sizeof(double)*K);//为质心集合申请空间
CenterIndex=(int *)malloc(sizeof(int)*K);//为质心集合索引申请空间
CenterCopy=(double *)malloc(sizeof(double)*K);//为质心集合副本申请空间
Top=(int *)malloc(sizeof(int)*K);
AllData=(double *)malloc(sizeof(double)*N);//为数据集合申请空间
Cluster=(double **)malloc(sizeof(double *)*K);//为簇集合申请空间
//初始化K个簇集合
for(i=0;i<K;i++)
{
Cluster[i]=(double *)malloc(sizeof(double)*N);
Top[i]=0;
}
printf("输入%d数据: ",N);
for(i=0;i<N;i++)
{
scanf("%d",&(a)); AllData[i]=a;
}
InitCenter();//初始化质心集合
UpdateCluster();//初始化K个簇集合 }
/* 算法描述: K均值算法: 给定类的个数K,将N个对象分到K个类中去, 使得类内对象之间的相似性最大,而类之间的相似性最小。 */
main()
{
int Flag=1;//迭代标志,若为false,则迭代结束
int i=0;
InitData();//初始化数据
while(Flag)//开始迭代
{
UpdateCluster();//更新各个聚类
UpdateCenter();//更新质心数组
if(IsEqual(Center,CenterCopy))//如果本次迭代与前次的质心聚合相等,即已收敛,结束退出
{
Flag=0;
}
else//否则将质心副本置为本次迭代得到的的质心集合
{
CopyCenter();//将质心副本置为本次迭代得到的的质心集合
}
}
Print();//输出结果
getchar();
getchar();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -