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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据挖掘实验报告(三)

聚类分析

姓名:李圣杰

班级:计算机1304

学号:02

一、实验目的

1、掌握k-means 聚类方法;

2、通过自行编程,对三维空间内的点用k-means 方法聚类。

二、实验设备

PC 一台,dev-c++

三、实验内容

1.问题描述:

立体空间三维点的聚类.

说明:数据放在数据文件中(不得放在程序中),第一行是数据的个数,以后各行是各个点的x,y,z 坐标。

2.设计要求

读取文本文件数据,并用K-means 方法输出聚类中心 3. 需求分析

k-means 算法接受输入量k ;然后将n 个数据对象划分为 k 个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。

k-means 算法的工作过程说明如下:首先从n 个数据对象任意选择k 个对象作为初始聚类中心,而对于所剩下的其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类。然后,再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值),不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数,具体定义如下:

2

1∑∑=∈-=k

i i

i

E 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 <> #include <> #include <> #include <> 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(f loat));

for(i=1; i

return p;

}

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

void freearray(float** p)

{

free(*p); free(p);

}

void loaddata()

{

FILE * fp;

int i,j;

if((fp=fopen("","r"))==NULL) {

printf("Cannot open file!\n");

exit(0);

}

if(feof(fp))

{

printf(" is a empty file!\n"); fclose(fp);

exit(0);

}

if(fscanf(fp,"K=%d,Vectordim=%d, datasize=%d\n",&K,&Vectordim,&da tasize)!=3)

{

printf("load error!\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]);

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

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

相关文档
最新文档