資源簡介
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
- 上一篇:計算方法實驗5--埃特金加速迭代算法
- 下一篇:單片機計時器/計數器產生方波
評論
共有 條評論