当前位置:文档之家› 数据挖掘实验报告-聚类分析

数据挖掘实验报告-聚类分析

数据挖掘实验报告(三)聚类分析姓名:李圣杰班级:计算机1304学号:1311610602一、实验目的1、 掌握k-means 聚类方法;2、 通过自行编程,对三维空间内的点用k-means 方法聚类。

二、实验设备PC 一台,dev-c++5.11三、实验内容1.问题描述:立体空间三维点的聚类.说明:数据放在数据文件中(不得放在程序中),第一行是数据的个数,以后各行是各个点的x,y,z 坐标。

2.设计要求读取文本文件数据,并用K-means 方法输出聚类中心 3. 需求分析k-means 算法接受输入量k ;然后将n 个数据对象划分为 k 个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。

聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。

k-means 算法的工作过程说明如下:首先从n 个数据对象任意选择k 个对象作为初始聚类中心,而对于所剩下的其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类。

然后,再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值),不断重复这一过程直到标准测度函数开始收敛为止。

一般都采用均方差作为标准测度函数,具体定义如下:21∑∑=∈-=ki iiE C p m p (1)其中E 为数据库中所有对象的均方差之和,p 为代表对象的空间中的一个点,m i 为聚类C i 的均值(p 和m i 均是多维的)。

公式(1)所示的聚类标准,旨在使所获得的k 个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。

四、实验步骤Step 1.读取数据组,从N 个数据对象任意选择k 个对象作为初始聚类中心; Step 2.循环Step 3到Step 4直到每个聚类不再发生变化为止; Step 3.根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离,并根据最小距离重新对相应对象进行划分;Step 4.重新计算每个(有变化)聚类的均值(中心对象)。

代码#include <stdlib.h> #include <stdio.h>#include <math.h> #include <time.h>int K,Vectordim,datasize,seed=1;float **data,**kmatrix;float *max_column,*min_column;/*创建维数可指定的二维动态数组array[m][n]*/float** array(int m, int n){float **p;int i;p=(float**)malloc(m*sizeof(float*));p[0]=(float*)malloc(m*n*sizeof(float)); for(i=1; i<m; ++i) p[i]=p[i-1]+n;return p;}/*释放二维数组所占用的内存*/void freearray(float** p){free(*p); free(p);}void loaddata(){FILE * fp;int i,j;if((fp=fopen("data.txt","r"))==NULL){printf("Cannot open file!\n");exit(0);}if(feof(fp)){printf("data.txt is a empty file!\n");fclose(fp);exit(0);}if(fscanf(fp,"K=%d,Vectordim=%d,datasize= %d\n",&K,&Vectordim,&datasize)!=3){printf("load error!\n");fclose(fp);exit(0);}data=array(datasize,Vectordim+1);for(i=0;i<datasize;i++){data[i][Vectordim]=0;for(j=0;j<Vectordim;j++){if(j==(Vectordim-1))fscanf(fp,"%f\n",&data[i][j]);else fscanf(fp,"%f ",&data[i][j]);/*printf("%f ",data[i][j]);*/}}}double euclid_distance(float a[],float b[],int dim){int i;double sum=0;for(i=0;i<dim;i++)sum+=pow(a[i]-b[i],2);return sqrt(sum);}void getmaxmin(float **a){int i,j;max_column=(float*)malloc(sizeof(float)*Vectordim);min_column=(float*)malloc(sizeof(float)*Vectordim);for(i=0;i<Vectordim;i++){max_column[i]=a[0][i];min_column[i]=a[0][i];}for(i=0;i<Vectordim;i++){for(j=1;j<datasize;j++){if(a[j][i]>max_column[i])max_column[i]=a[j][i];if(a[j][i]<min_column[i])min_column[i]=a[j][i ];/*printf("max_column[%d]=%f,min_column[%d]=%f\n",i,max_column[i],i, min_column[i]);*/}}}void initializerandom(){seed++;srand((unsigned) time(NULL)+seed);}float randomreal(float Low, float High){return ((float) rand() / RAND_MAX) * (High-Low) + Low;}void K_locations_random(){int i,j;kmatrix=array(K,Vectordim+1);printf("Randomly the K-locations are initialized as follows:\n");for(i=0;i<K;i++){initializerandom();kmatrix[i][Vectordim]=(float)(i+1);printf("location---%d: ",i+1);for(j=0;j<Vectordim;j++){kmatrix[i][j]=randomreal(min_column[i],ma x_column[i]);printf("%f, ",kmatrix[i][j]);} printf("\n");}}int existemptyclass(){int *empty,i,j,ef;empty=(int *)malloc(sizeof(int)*K);for(i=0;i<K;i++) empty[i]=0;for(i=0;i<datasize;i++){for(j=1;j<=K;j++){if(j==(int)data[i][Vectordim]) empty[j-1]++;}}for(i=0,ef=0;i<K;i++)if(0==empty[i]) ef=1;return ef;}int cluster(){int i,j,flag,eflag=1;double closest,d;for(i=0;i<datasize;i++){closest=euclid_distance(data[i],kmatrix[0],V ectordim);flag=1;for(j=1;j<K;j++){d=euclid_distance(data[i],kmatrix[j],Vectordi m);if(d<closest) {closest=d;flag=j+1;}}if(data[i][Vectordim]!=(float)flag) {eflag=0;}data[i][Vectordim]=(float)flag;}return eflag;}void update_k_location(){int i,j,number,m;float *temp;temp=(float*)malloc(sizeof(float)*(Vectordim));for(m=0;m<Vectordim;m++) temp[m]=0;for(number=0,i=1;i<=K;i++){for(m=0;m<Vectordim;m++)temp[m]=0;for(j=0;j<datasize;j++){if(data[j][Vectordim]==i){number++;for(m=0;m<Vectordim;m++){temp[m]+=data[j][m];}}}for(m=0;m<Vectordim;m++){kmatrix[i-1][m]=temp[m]/number;/*printf("%f\n",kmatrix[i-1][m]);*/}}free(temp);}void output(){int i,j,m;/*for(m=0;m<datasize;m++)*//*printf("data[%d][Vectordim]=%f\n",m,dat a[m][Vectordim]);*/for(i=1;i<=K;i++){printf("The following data are clusterd as CLASS %d:\n",i);for(j=0;j<datasize;j++){if(data[j][Vectordim]==(float)i){for(m=0;m<Vectordim;m++) printf("%f ",data[j][m]);printf("\n");}}}}void freememory(){freearray(kmatrix);freearray(data);free(max_column);free(min_column);}main(){int end_flag,empty_flag=0;long int time;loaddata();getmaxmin(data);while(1){K_locations_random();end_flag=cluster();if(existemptyclass()) {printf("There is a empty class!\nSo restart!\n");continue;} time=0;while(!end_flag){if(time>1000)break;time++;update_k_location();end_flag=cluster();}empty_flag=existemptyclass();if(empty_flag) {printf("There is a empty class!\nSo restart!\n");continue;}else break;}printf("\nAfter %ld times calculation\n",time);output();freememory();}实验数据文件:data.txt用空格分开K=3,Vectordim=3,datasize=15-25 22.2 -35.3431.2 -14.4 2332.02 -23 24.44-25.35 36.3 -33.34-20.2 27.333 -28.22-15.66 17.33 -23.3326.3 -31.34 16.3-22.544 16.2 -32.2212.2 -15.22 22.11-41.241 25.232 -35.338-22.22 45.22 23.55-34.22 50.14 30.9815.23 -30.11 20.987-32.5 15.3 -25.22-38.97 20.11 33.22五、结果截图。

相关主题