?? 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 + -