/*
 * 创建日期 2006-5-2
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
//伪代码如下:
//for k=1,…n,令R(k)为从D中随机选取的一个点;
//while在聚类Ck中有变化发生 do
//形成聚类;
//for k=1,….,n do
//Ck={X属于D|D(Rk,x)≤D(Rj,x) 对所有j=1…..k,j≠k};
//end;
//计算新的聚类中心;
//for k=1,….,n do
//Rk =Ck内点的均值向量;
//end;
//end;package lijinlei;import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;/**
 * @author Boss
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
public class cc {
  private int k = 0, n = 0;
  private float temp = 0;
  private float min, m;  private float[][] a = new float[150][4];
  private float[][] b = new float[3][4];
  private float[][] c = new float[3][4];
  private float[][] g = new float[3][4];
  private float d[] = new float[3];
  private int T[] = new int[150];  private void cluster() {
    int i = 0;
    int s = 0;
    int t = 0;
    int r, y,j = 0;    // 首次聚类
    System.out.println("** b[t][s]**");
    for (t = 0; t < 3; t++) {
      for (s = 0; s < 4; s++) {
        System.out.print("** " + b[t][s]);
      }
      System.out.println("\n");
    }    for (i = 0; i < 150; i++) {
      for (t = 0; t < 3; t++) {
        d[t] = (a[i][0] - b[t][0]) * (a[i][0] - b[t][0]) +
            (a[i][1] - b[t][1]) * (a[i][1] - b[t][1]) +
            (a[i][2] - b[t][2]) * (a[i][2] - b[t][2]) +
            (a[i][3] - b[t][3]) * (a[i][3] - b[t][3]);
      }
      min = d[0];
      m = Math.min(d[1], d[2]);
      r = d[1] > d[2] ? 2 : 1;
      if (d[0] > m) {
        k = r;
      }
      else {
        k = 0;
      }
      System.out.println("%%" + i + " " + k);
      T[i] = k;
    }
    
    /*for (t = 0; t < 3; t++) 
     {
     for (s = 0; s < 4; s++) 
     {g[t][s]=0;}
     }*/
    
    //计算初始聚类中心
    for (t = 0; t < 3; t++) 
    {
      y = 0;
      for (s = 0; s < 4; s++) 
      {
        y = 0;
        g[t][s]=0;
        for (i = 0; i < 150; i++) 
        {
          if (T[i] == t) 
          {
            y++;
            g[t][s] += a[i][s];            
          }         
        }
        c[t][s] = g[t][s] / y;
        System.out.print("***" + c[t][s]);
      }
      System.out.println("\n");
    }    }  public static void main(String[] args) {    try 
{
      int i = 0, j = 0, t = 0, s = 0;
      FileReader fs = new FileReader("./test.txt");
      BufferedReader br = new BufferedReader(fs);
      String record = new String();
      cc clu = new cc();
      while ( (record = br.readLine()) != null) 
      {
        StringTokenizer st = new StringTokenizer(record);
        j = 0;
        while (st.hasMoreTokens()) //测试此 tokenizer 的字符串中是否还有更多的可用标记。
        { 
          clu.a[i][j] = Float.parseFloat(st.nextToken()); //返回此 string tokenizer 的下一个标记。
          //System.out.print(" "+a[i][j]);
          j++;
        }
        i++;
      }      //获取聚类中心
      int r;
      for (t = 0; t < 3; t++) {
        r = (int) (Math.random() * 149);
        for (s = 0; s < 4; s++) {
          clu.b[t][s] = clu.a[r][s];
        }
      }
      clu.cluster();      //递归迭代,当前后聚类中心之差小于0.001时结束
     // float temp[][] = new float[3][4];
      int n=0;
    
   do
   {
    for (i = 0; i < 3; i++)
    {
    for (j = 0; j < 4; j++) 
     clu.b[i][j] = clu.c[i][j];
   }
        clu.cluster();
        n++;
   }while(n>20);第一次运行到}while(n>20); 这里的时候就跳出了,根本就没有达到n<20的条件,不知道怎么回事?
   
   
    }
    catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    catch (IOException e) {
      e.printStackTrace();
    }
  }
}
/////////////////////////////////////////////////////////////////////////////////////////
do
   {
    for (i = 0; i < 3; i++)
    {
    for (j = 0; j < 4; j++) 
     clu.b[i][j] = clu.c[i][j];
   }
        clu.cluster();
        n++;
   }while(n>20);第一次运行到}while(n>20); 这里的时候就跳出了,根本就没有达到n<20的条件,不知道怎么回事?
/////////////////////////////////////////////////////////////////////////////////////////
test.txt内容为:
5.1 3.5 1.4 0.2
4.9 3.0 1.4 0.2
4.7 3.2 1.3 0.2
4.6 3.1 1.5 0.2
5.0 3.6 1.4 0.2
5.4 3.9 1.7 0.4
4.6 3.4 1.4 0.3
5.0 3.4 1.5 0.2
4.4 2.9 1.4 0.2
4.9 3.1 1.5 0.1
5.4 3.7 1.5 0.2
4.8 3.4 1.6 0.2
4.8 3.0 1.4 0.1
4.3 3.0 1.1 0.1
5.8 4.0 1.2 0.2
5.7 4.4 1.5 0.4
5.4 3.9 1.3 0.4
5.1 3.5 1.4 0.3
5.7 3.8 1.7 0.3
5.1 3.8 1.5 0.3
5.4 3.4 1.7 0.2
5.1 3.7 1.5 0.4
4.6 3.6 1.0 0.2
5.1 3.3 1.7 0.5
4.8 3.4 1.9 0.2
5.0 3.0 1.6 0.2
5.0 3.4 1.6 0.4
5.2 3.5 1.5 0.2
5.2 3.4 1.4 0.2
4.7 3.2 1.6 0.2   
4.8 3.1 1.6 0.2   
5.4 3.4 1.5 0.4   
5.2 4.1 1.5 0.1   
5.5 4.2 1.4 0.2   
4.9 3.1 1.5 0.1   
5.0 3.2 1.2 0.2   
5.5 3.5 1.3 0.2   
4.9 3.1 1.5 0.1   
4.4 3.0 1.3 0.2   
5.1 3.4 1.5 0.2   
5.0 3.5 1.3 0.3   
4.5 2.3 1.3 0.3   
4.4 3.2 1.3 0.2   
5.0 3.5 1.6 0.6   
5.1 3.8 1.9 0.4   
4.8 3.0 1.4 0.3   
5.1 3.8 1.6 0.2   
4.6 3.2 1.4 0.2   
5.3 3.7 1.5 0.2   
5.0 3.3 1.4 0.2   
7.0 3.2 4.7 1.4   
6.4 3.2 4.5 1.5   
6.9 3.1 4.9 1.5   
5.5 2.3 4.0 1.3   
6.5 2.8 4.6 1.5   
5.7 2.8 4.5 1.3   
6.3 3.3 4.7 1.6   
4.9 2.4 3.3 1.0   
6.6 2.9 4.6 1.3   
5.2 2.7 3.9 1.4   
5.0 2.0 3.5 1.0   
5.9 3.0 4.2 1.5   
6.0 2.2 4.0 1.0   
6.1 2.9 4.7 1.4   
5.6 2.9 3.6 1.3   
6.7 3.1 4.4 1.4   
5.6 3.0 4.5 1.5   
5.8 2.7 4.1 1.0   
6.2 2.2 4.5 1.5   
5.6 2.5 3.9 1.1   
5.9 3.2 4.8 1.8   
6.1 2.8 4.0 1.3   
6.3 2.5 4.9 1.5   
6.1 2.8 4.7 1.2   
6.4 2.9 4.3 1.3   
6.6 3.0 4.4 1.4   
6.8 2.8 4.8 1.4   
6.7 3.0 5.0 1.7   
6.0 2.9 4.5 1.5   
5.7 2.6 3.5 1.0   
5.5 2.4 3.8 1.1   
5.5 2.4 3.7 1.0   
5.8 2.7 3.9 1.2   
6.0 2.7 5.1 1.6   
5.4 3.0 4.5 1.5   
6.0 3.4 4.5 1.6   
6.7 3.1 4.7 1.5   
6.3 2.3 4.4 1.3   
5.6 3.0 4.1 1.3   
5.5 2.5 4.0 1.3   
5.5 2.6 4.4 1.2   
6.1 3.0 4.6 1.4   
5.8 2.6 4.0 1.2   
5.0 2.3 3.3 1.0   
5.6 2.7 4.2 1.3   
5.7 3.0 4.2 1.2   
5.7 2.9 4.2 1.3   
6.2 2.9 4.3 1.3   
5.1 2.5 3.0 1.1   
5.7 2.8 4.1 1.3   
6.3 3.3 6.0 2.5   
5.8 2.7 5.1 1.9   
7.1 3.0 5.9 2.1   
6.3 2.9 5.6 1.8   
6.5 3.0 5.8 2.2   
7.6 3.0 6.6 2.1   
4.9 2.5 4.5 1.7   
7.3 2.9 6.3 1.8   
6.7 2.5 5.8 1.8   
7.2 3.6 6.1 2.5   
6.5 3.2 5.1 2.0   
6.4 2.7 5.3 1.9   
6.8 3.0 5.5 2.1   
5.7 2.5 5.0 2.0   
5.8 2.8 5.1 2.4   
6.4 3.2 5.3 2.3   
6.5 3.0 5.5 1.8   
7.7 3.8 6.7 2.2   
7.7 2.6 6.9 2.3   
6.0 2.2 5.0 1.5   
6.9 3.2 5.7 2.3   
5.6 2.8 4.9 2.0   
7.7 2.8 6.7 2.0   
6.3 2.7 4.9 1.8   
6.7 3.3 5.7 2.1   
7.2 3.2 6.0 1.8   
6.2 2.8 4.8 1.8   
6.1 3.0 4.9 1.8   
6.4 2.8 5.6 2.1   
7.2 3.0 5.8 1.6   
7.4 2.8 6.1 1.9   
7.9 3.8 6.4 2.0   
6.4 2.8 5.6 2.2   
6.3 2.8 5.1 1.5   
6.1 2.6 5.6 1.4   
7.7 3.0 6.1 2.3   
6.3 3.4 5.6 2.4   
6.4 3.1 5.5 1.8   
6.0 3.0 4.8 1.8   
6.9 3.1 5.4 2.1   
6.7 3.1 5.6 2.4   
6.9 3.1 5.1 2.3   
5.8 2.7 5.1 1.9   
6.8 3.2 5.9 2.3   
6.7 3.3 5.7 2.5   
6.7 3.0 5.2 2.3   
6.3 2.5 5.0 1.9   
6.5 3.0 5.2 2.0   
6.2 3.4 5.4 2.3   
5.9 3.0 5.1 1.8