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

上传人:b****5 文档编号:7885569 上传时间:2023-01-26 格式:DOCX 页数:10 大小:17.36KB
下载 相关 举报
数据挖掘实验报告聚类分析.docx_第1页
第1页 / 共10页
数据挖掘实验报告聚类分析.docx_第2页
第2页 / 共10页
数据挖掘实验报告聚类分析.docx_第3页
第3页 / 共10页
数据挖掘实验报告聚类分析.docx_第4页
第4页 / 共10页
数据挖掘实验报告聚类分析.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

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

《数据挖掘实验报告聚类分析.docx》由会员分享,可在线阅读,更多相关《数据挖掘实验报告聚类分析.docx(10页珍藏版)》请在冰豆网上搜索。

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

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

资料范本

 

本资料为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;i

returnp;

}

/*释放二维数组所占用的内存*/

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;i

sum+=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;i

for(i=0;i

{

for(j=1;j<=K;j++)

{

if(j==(int)data[i][Vectordim])empty[j-1]++;

}

}

for(i=0,ef=0;i

if(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;m

for(number=0,i=1;i<=K;i++)

{

for(m=0;m

for(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;m

printf("\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

五、结果截图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1