k_algorithm.c
上传用户:bjtelijie
上传日期:2010-01-01
资源大小:87k
文件大小:4k
源码类别:

数学计算

开发平台:

Visual C++

  1. #include  <stdio.h>
  2. #include  <stdlib.h>
  3. #include  <string.h>
  4. #include  <math.h>
  5. int  vectornum;
  6. int  vectorsize;
  7. float  * datafield;
  8. float  * tempcenter;
  9. struct  GROUP
  10. {
  11. float  * center;//聚类中心坐标
  12. int  groupsize;//聚类包含的样本个数
  13. } g ,  * group;
  14. int  K;//聚类中心个数
  15. void  initiate ();//读入数据,初始化聚类中心,参数设定默认值
  16. int  allocate ();//将模式样本分配给最近的聚类
  17. void  showresult ();//显示分类结果
  18. float  distance (float  * x , float  * y);//计算两个向量间的欧氏距离
  19. float  data (int i , int j);//从datafield中读取指定位置的值
  20. float  * vector (int i);//从datafield中读取指定的样本向量
  21. void  write (int i , int j , float data);//向datafield中指定位置写入值
  22. void  main ()
  23. {
  24. int  i;
  25. initiate ();
  26.     
  27. for (i = 1 ; i < 50 ; i++)
  28. {
  29. showresult ();
  30. if (allocate () == 1)break;
  31. }
  32. showresult ();
  33. free (datafield);
  34. free (tempcenter);
  35. for (i = 0 ; i < K ; i++)
  36. free (group[i].center);
  37. }
  38. void  initiate ()
  39. {
  40. int  i , j , size;
  41. float  d;
  42. FILE  * df;
  43. K = 2;
  44. if ((df = fopen ("data.txt" , "r")) == NULL)
  45. {
  46. printf ("Cannot open filen");
  47. exit (1);
  48. }
  49. fscanf (df , "%5d" , &vectornum);
  50. fscanf (df , "%5d" , &vectorsize);
  51. size = vectornum * (vectorsize + 1);
  52. datafield = (float *) calloc (size , sizeof (d));
  53. tempcenter = (float *) calloc (vectorsize , sizeof (d));
  54. for (i = 0 ; i < vectornum ; i++)
  55. {
  56. for (j = 0 ; j < vectorsize ; j++)
  57. {
  58. fscanf (df , "%10f" , &d);
  59. write (i , j + 1 , d);
  60. }
  61. write (i , 0 , -1);
  62. }
  63. if (feof (df)) printf (" File read error! ");
  64. fclose (df);
  65. printf ("请输入聚类数:n");
  66. scanf ("%d" , &K);
  67. group = (struct GROUP *) calloc (K , sizeof (g));
  68. for (i = 0 ; i < K ; i++)
  69. {
  70. group[i].center = (float*) calloc ((vectorsize) , sizeof (d));
  71. group[i].groupsize = 0;
  72. }
  73. for (i = 0 ; i < K ; i++)
  74. {
  75. for (j = 0 ; j < vectorsize ; j++)
  76. {
  77. *(group[i].center + j) = data (i , j + 1);
  78. }
  79. }
  80. }
  81. int  allocate()
  82. {
  83. int  i , j , k , flag , index;
  84. float  D , D1 , sum;
  85. for (i = 0 ; i < K ; i++)
  86. {
  87. group[i].groupsize = 0;
  88. }
  89. for (i = 0 ; i < vectornum ; i++)//按距离分配到各聚类域
  90. {
  91. D = distance (group[0].center , vector(i));
  92. k = 0;
  93. for(j = 1 ; j < K ; j++)
  94. {
  95. D1 = distance (group[j].center , vector(i));
  96. if(D > D1)
  97. {
  98. k = j;
  99. D = D1;
  100. }
  101. }
  102. write (i , 0 , (float) k);
  103. group[k].groupsize++;
  104. }
  105. flag = 1;
  106. for (index = 0 ; index < K ; index++)//计算新的聚类中心
  107. {
  108. for (j = 0 ; j < vectorsize ; j++)
  109. tempcenter[j] = 0.0;
  110. sum = (float) group[index].groupsize;
  111. for (i = 0 ; i < vectornum ; i++)
  112. {
  113. if (index == (int) data (i , 0))
  114. for (j = 0 ; j < vectorsize ; j++)
  115. tempcenter[j] += data (i , j + 1) / sum;
  116. }
  117. for (j = 0 ; j < vectorsize ; j++)
  118. {
  119. if ( tempcenter[j] != group[index].center[j])
  120. {
  121. group[index].center[j] = tempcenter[j];
  122. flag = 0;
  123. }
  124. }
  125. }
  126. return flag;
  127. }
  128. void  showresult()
  129. {
  130. int  i , j , k;
  131. for (i = 0 ; i < K ; i++)
  132. {
  133. printf ("n第%3d组聚类中心坐标为:" , i + 1);
  134. for (j = 0 ; j < vectorsize ; j++)
  135. printf (" %10f " , group[i].center[j]);
  136. printf (" n聚类包含的样本点的坐标为:n ");
  137. for (j = 0 ; j < vectornum ; j++)
  138. {
  139. if (data (j , 0) == i)
  140. {
  141. for (k = 0 ; k < vectorsize ; k++)
  142. {
  143. printf (" %10f " , data (j , k + 1));
  144. }
  145. printf (" n ");
  146. }
  147. }
  148. }
  149. printf (" n ");
  150. }
  151. float  data (int i , int j)
  152. {
  153. return *(datafield + i * (vectorsize + 1) + j);
  154. }
  155. void  write (int i , int j , float data)
  156. {
  157. *(datafield + i * (vectorsize + 1) + j) = data;
  158. }
  159. float  * vector (int i)
  160. return datafield + i * (vectorsize + 1) + 1;
  161. }
  162. float  distance (float  * x , float  * y)
  163. {
  164. int  i;
  165. float  z;
  166. for (i = 0 , z = 0 ; i < vectorsize ; i++)
  167. z = z + ((* (x + i)) - (* (y + i)))*((* (x + i))-(* (y + i)));
  168. return (float) sqrt (z);
  169. }