资源简介

K-means聚类算法c语言实现。样本数据从文件读入,支持任意维数数据和任意k值(k当然要小于样本数),同时可以防止分出空类。 为做作业原创

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 

int KVectordimdatasizeseed=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  return p;
}

/*释放二维数组所占用的内存*/
void freearray(float** p)
{
  free(*p); free(p);
}

void loaddata()
{
   FILE * fp;
   int ij;
   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=%dVectordim=%ddatasize=%d\n“&K&Vectordim&datasize)!=3)
    {
    printf(“load error!\n“);
    fclose(fp);
exit(0);
}
   data=array(datasizeVectordim+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 ij;
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“imax_column[i]imin_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 ij;
kmatrix=array(KVectordim+1);
printf(“Randomly the K-locations are initialized as follows:\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“);
}
}

int existemptyclass()
{
int *emptyijef;
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=0ef=0;i if(0==empty[i]) ef=1;
return ef;
}

int cluster()
{
int ijflageflag=1;
double closestd;
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[

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        332  2009-11-17 01:11  kmeans\data\data.txt

     文件        141  2009-11-17 01:14  kmeans\data\data2.txt

     文件         89  2009-11-17 01:36  kmeans\data\说明.txt

     文件        332  2009-11-17 01:11  kmeans\data.txt

     文件       4728  2009-11-17 01:22  kmeans\k.c

     文件      24064  2009-11-17 01:34  kmeans\readme.doc

     目录          0  2009-11-17 01:37  kmeans\data

     目录          0  2009-11-17 01:35  kmeans

----------- ---------  ---------- -----  ----

                29686                    8


评论

共有 条评论