数据挖掘实验报告聚类分析.docx
《数据挖掘实验报告聚类分析.docx》由会员分享,可在线阅读,更多相关《数据挖掘实验报告聚类分析.docx(10页珍藏版)》请在冰豆网上搜索。
数据挖掘实验报告聚类分析
资料范本
本资料为word版本,可以直接编辑和打印,感谢您的下载
数据挖掘实验报告-聚类分析
地点:
__________________
时间:
__________________
说明:
本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容
数据挖掘实验报告(三)
聚类分析
姓名:
李圣杰
班级:
计算机1304
学号:
1311610602
一、实验目的
掌握k-means聚类方法;
通过自行编程,对三维空间内的点用k-means方法聚类。
二、实验设备
PC一台,dev-c++5.11
三、实验内容
1.问题描述:
立体空间三维点的聚类.
说明:
数据放在数据文件中(不得放在程序中),第一行是数据的个数,以后各行是各个点的x,y,z坐标。
2.设计要求
读取文本文件数据,并用K-means方法输出聚类中心
3.需求分析
k-means算法接受输入量k;然后将n个数据对象划分为k个聚类以便使得所获得的聚类满足:
同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。
聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。
k-means算法的工作过程说明如下:
首先从n个数据对象任意选择k个对象作为初始聚类中心,而对于所剩下的其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类。
然后,再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值),不断重复这一过程直到标准测度函数开始收敛为止。
一般都采用均方差作为标准测度函数,具体定义如下:
(1)
其中E为数据库中所有对象的均方差之和,p为代表对象的空间中的一个点,mi为聚类Ci的均值(p和mi均是多维的)。
公式
(1)所示的聚类标准,旨在使所获得的k个聚类具有以下特点:
各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。
四、实验步骤
Step1.读取数据组,从N个数据对象任意选择k个对象作为初始聚类中心;
Step2.循环Step3到Step4直到每个聚类不再发生变化为止;
Step3.根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离,并根据最小距离重新对相应对象进行划分;
Step4.重新计算每个(有变化)聚类的均值(中心对象)。
代码
#include
#include
#include
#include
intK,Vectordim,datasize,seed=1;
float**data,**kmatrix;
float*max_column,*min_column;
/*创建维数可指定的二维动态数组array[m][n]*/
float**array(intm,intn)
{
float**p;
inti;
p=(float**)malloc(m*sizeof(float*));
p[0]=(float*)malloc(m*n*sizeof(float));
for(i=1;ireturnp;
}
/*释放二维数组所占用的内存*/
voidfreearray(float**p)
{
free(*p);free(p);
}
voidloaddata()
{
FILE*fp;
inti,j;
if((fp=fopen("data.txt","r"))==NULL)
{
printf("Cannotopenfile!
\n");
exit(0);
}
if(feof(fp))
{
printf("data.txtisaemptyfile!
\n");
fclose(fp);
exit(0);
}
if(fscanf(fp,"K=%d,Vectordim=%d,datasize=%d\n",&K,&Vectordim,&datasize)!
=3)
{
printf("loaderror!
\n");
fclose(fp);
exit(0);
}
data=array(datasize,Vectordim+1);
for(i=0;i{
data[i][Vectordim]=0;
for(j=0;j{
if(j==(Vectordim-1))fscanf(fp,"%f\n",&data[i][j]);
elsefscanf(fp,"%f",&data[i][j]);
/*printf("%f",data[i][j]);*/
}
}
}
doubleeuclid_distance(floata[],floatb[],intdim)
{
inti;
doublesum=0;
for(i=0;isum+=pow(a[i]-b[i],2);
returnsqrt(sum);
}
voidgetmaxmin(float**a)
{
inti,j;
max_column=(float*)malloc(sizeof(float)*Vectordim);
min_column=(float*)malloc(sizeof(float)*Vectordim);
for(i=0;i{
max_column[i]=a[0][i];
min_column[i]=a[0][i];
}
for(i=0;i{
for(j=1;j{
if(a[j][i]>max_column[i])max_column[i]=a[j][i];
if(a[j][i]/*printf("max_column[%d]=%f,min_column[%d]=%f\n",i,max_column[i],i,min_column[i]);*/
}
}
}
voidinitializerandom()
{
seed++;
srand((unsigned)time(NULL)+seed);
}
floatrandomreal(floatLow,floatHigh)
{
return((float)rand()/RAND_MAX)*(High-Low)+Low;
}
voidK_locations_random()
{
inti,j;
kmatrix=array(K,Vectordim+1);
printf("RandomlytheK-locationsareinitializedasfollows:
\n");
for(i=0;i{
initializerandom();
kmatrix[i][Vectordim]=(float)(i+1);
printf("location---%d:
",i+1);
for(j=0;j{kmatrix[i][j]=randomreal(min_column[i],max_column[i]);printf("%f,",kmatrix[i][j]);}
printf("\n");
}
}
intexistemptyclass()
{
int*empty,i,j,ef;
empty=(int*)malloc(sizeof(int)*K);
for(i=0;ifor(i=0;i{
for(j=1;j<=K;j++)
{
if(j==(int)data[i][Vectordim])empty[j-1]++;
}
}
for(i=0,ef=0;iif(0==empty[i])ef=1;
returnef;
}
intcluster()
{
inti,j,flag,eflag=1;
doubleclosest,d;
for(i=0;i{
closest=euclid_distance(data[i],kmatrix[0],Vectordim);
flag=1;
for(j=1;j{
d=euclid_distance(data[i],kmatrix[j],Vectordim);
if(d}
if(data[i][Vectordim]!
=(float)flag){eflag=0;}
data[i][Vectordim]=(float)flag;
}
returneflag;
}
voidupdate_k_location()
{
inti,j,number,m;
float*temp;
temp=(float*)malloc(sizeof(float)*(Vectordim));
for(m=0;mfor(number=0,i=1;i<=K;i++)
{
for(m=0;mfor(j=0;j{
if(data[j][Vectordim]==i)
{
number++;
for(m=0;m{
temp[m]+=data[j][m];
}
}
}
for(m=0;m{
kmatrix[i-1][m]=temp[m]/number;
/*printf("%f\n",kmatrix[i-1][m]);*/
}
}
free(temp);
}
voidoutput()
{
inti,j,m;
/*for(m=0;m/*printf("data[%d][Vectordim]=%f\n",m,data[m][Vectordim]);*/
for(i=1;i<=K;i++)
{
printf("ThefollowingdataareclusterdasCLASS%d:
\n",i);
for(j=0;j{
if(data[j][Vectordim]==(float)i)
{for(m=0;mprintf("\n");}
}
}
}
voidfreememory()
{
freearray(kmatrix);
freearray(data);
free(max_column);
free(min_column);
}
main()
{
intend_flag,empty_flag=0;
longinttime;
loaddata();
getmaxmin(data);
while
(1)
{
K_locations_random();
end_flag=cluster();
if(existemptyclass()){printf("Thereisaemptyclass!
\nSorestart!
\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("Thereisaemptyclass!
\nSorestart!
\n");continue;}
elsebreak;
}
printf("\nAfter%ldtimescalculation\n",time);
output();
freememory();
}
实验数据文件:
data.txt用空格分开
K=3,Vectordim=3,datasize=15
-2522.2-35.34
31.2-14.423
32.02-2324.44
-25.3536.3-33.34
-20.227.333-28.22
-15.6617.33-23.33
26.3-31.3416.3
-22.54416.2-32.22
12.2-15.2222.11
-41.24125.232-35.338
-22.2245.2223.55
-34.2250.1430.98
15.23-30.1120.987
-32.515.3-25.22
-38.9720.1133.22
五、结果截图