自己写的c语言写的数据挖掘的层次聚类算法,只用于学习交流,请勿转载!!!!
# include<stdio.h>
# include<math.h>
main(){
int num,i,j,t,clear=0,place,count,numb; //Cnum //clear变量用于消除合并后的前一个集合书中第144页的第(3)步,count表示目前聚类个数,Cnum表示需要的聚类个数
float distance[50][50]; //distance[m][n]中,m表示第m个数,n表示第n个数,总体表示n与m的距离
int data[50],cluster[50][50],min;
printf(“请输入数据项的个数:”);
scanf(“%d”,&num);
for(i=0;i<num;i++){
printf(“请输入第%d个数据:”,i+1);
scanf(“%d”,&data[i]);
}
/*printf(“请输入需要聚类的个数:”);
scanf(“%d”,&Cnum);*///用于限定聚类个数的,日后再来搭建
for(i=0;i<num;i++)
cluster[i][0]=data[i];
for(i=0;i<num-1;i++){
for(j=0;j<num-(i+1);j++)
distance[i][j]=sqrt(pow((cluster[i][0]-cluster[j+i+1][0]),2));
} //这里以上是第一次聚类,每个元素作为一类,并计算距离
//在这里我发现不需要运用结构体,用二维数组就可以了的cluster[m][n]m表示第几个元素初始每一行只有一个元素,后面再慢慢累加上去
count=num;
printf(“距离为:\n”);
for(i=0;i<num-1;i++){ //输出距离
printf(“其余元素与第%d个距离为:”,i+1);
for(j=0;j<num-1;j++)
if(distance[i][j]>=0)
printf(“%3.2f “,distance[i][j]);
putchar(‘\n’);
} //这里以后开始层次聚类的核心,需要添加循环
for(t=0;t<num-1;t++){
numb=0;
min=distance[t][0];
place=0;
for(i=1;i<num-1;i++){
if(min>distance[t][i]&&distance[t][i]>=0){
min=distance[t][i];
place=i;
}
}
printf(“第一行的最小值为:%d位置为%d\n”,min,place+1);
while(cluster[t+place+1][numb]>=0)
numb++;
for(i=0;i<num;i++){
if(cluster[t][i]>=0)
cluster[t+place+1][numb++]=cluster[t][i];
} //合并有点问题
clear++;
count–;
for(i=clear;i<num;i++){
for(j=0;j<num;j++)
if(cluster[i][j]>=0)
printf(“%d “,cluster[i][j]);
putchar(‘\n’);
}
printf(“目前聚类个数为:%d\n”,count);
}
getchar();//暂停用
}