现在有iris数据表格式如下:
pl   sl   pw   sw
2    3    5    8
3    5    4.5  8
2.5  4    4.5  7
....
....
请问怎么用fcm与k-means聚类算法实现对该数据的聚类,要求得出每个聚类的数目以及聚类的内容(如选择三个以下变量要求用二维或三维图形表示出结果)。实现一个算法,能正确实现的200分。

解决方案 »

  1.   

    k均值算法(k-means)与模糊聚类算法(fcm)的实现恐怕要到国外网找,或到cnki科技网上看有人做了的,用email索取。
      

  2.   

    翻译下面两段代码的照样给分:
    第一段:package xmu;import java.util.Random;public class Greedy {
    public int[] Greedy(double[][] SampleSet,int k)
    {
    int RowCount=SampleSet.length;
    int i,M[]=new int[k];
    int Newi;

    for (i=0;i<k;i++) M[i]=-1;
    Random rnd = new Random ();    //产生一个随机数,作为N1
         M[0]=rnd.nextInt(RowCount);          //选取随机点
        
         double dist[]=new double[RowCount];
         for (i=0;i<RowCount;i++) dist[i]=Double.MAX_VALUE;
         dist=d(SampleSet,M,M[0],dist);
         for (i=1;i<k;i++)
            {
         Newi=Nexti(dist,M);
         M[i]=Newi;
         dist=d(SampleSet,M,M[i],dist);
         }
         return M;
    }

    public int Nexti(double dist[],int M[])
    {
    double j=-1;
    int nexti=-1;
    for (int i=0;i<dist.length;i++)
    {
      if (j<dist[i] && !xinm(i,M)) 
      {
        j=dist[i];
        nexti=i;
      }
    }
    return nexti;
    }
    public double[] d(double[][] SampleSet,int M[],int Newi,double dist[])
    {
    int RowCount=SampleSet.length;
    for (int i=0;i<RowCount;i++)
     {
    if (!xinm(i,M)) 
    dist[i]=distXM(SampleSet,i,M,Newi,dist);
     }
    return dist;
    }

    public double distXM(double[][] SampleSet,int x,int M[],int Newi,double dist[])
    {
     double j;
     
     j=distXY(SampleSet[x],SampleSet[Newi]);
     if (dist[x]>j) 
     dist[x]=j;
     return dist[x];   
    }

    public double distXY(double x[],double y[])
    {
        double dist=0;

        for(int i=0;i<x.length;i++) dist=dist+(x[i]-y[i])*(x[i]-y[i]);
        dist=Math.sqrt(dist);
        return dist;
    }

    public boolean xinm(int x,int M[])
    {
      for (int i=0;i<M.length;i++)
      {
     if (x==M[i]) return true;
      } 
      return false;

    }
      

  3.   

    第二段:
    package xmu;import java.util.Random;
    import xmu.Greedy;public class Kmeans {
    Greedy greedy=new Greedy();

    public int[][] Kmeans(double[][] SampleSet,int k)
    {
    int i,j,M[]=new int[k];
    int RowCount=SampleSet.length;
    int dim=SampleSet[0].length;
    int U[][]=new int[k][RowCount];
    double c[][]=new double[k][dim],ReC[][]=new double[k][dim];

    M=greedy.Greedy(SampleSet,k);        //找到K个初始聚类中心
    for (i=0;i<k;i++)
      c[i]=SampleSet[M[i]];

    while (true)
    {
     for (i=0;i<k;i++)
      for (j=0;j<RowCount;j++)
        U[i][j]=0;              //初始化矩阵U
      U=UpdateU(SampleSet,c,k);
      ReC=ReCountC(SampleSet,U,k);
      if (Similar(c,ReC)) break;
      else c=ReC;
    }
    return U;
    }

    public boolean Similar(double c[][],double ReC[][])
    {
    int k=c.length;
    int i;
    double e2,E2=0;

    for (i=0;i<k;i++)
    {
    e2=0;
    e2=greedy.distXY(c[i],ReC[i]);
    e2*=e2;
    E2+=e2;
    }
    if (Math.sqrt(E2)<1) return true;
    return false;
    }

    public double[][] ReCountC(double[][] SampleSet,int U[][],int k)
    {
    int i,j,n,r;
    int RowCount=SampleSet.length;
    int dim=SampleSet[0].length;
    double ReC[][]=new double[k][dim];

    for (i=0;i<k;i++)
    {
     n=0;
     double s[]=new double[dim];
     for (r=0;r<dim;r++) s[r]=0;
     
     for(j=0;j<RowCount;j++)
       {
      if (U[i][j]==0) continue;
      n++;
      for (r=0;r<dim;r++) 
      s[r]+=SampleSet[j][r];
       } 
     for(r=0;r<dim;r++)
       {
     ReC[i][r]=s[r]/n;
       }
    }
    return ReC;
    }

    public int[][] UpdateU(double[][] SampleSet,double c[][],int k)
    {
    int i,j,n,RowCount=SampleSet.length;
    double  distXM,l;
    int U[][]=new int[k][RowCount];

    for (i=0;i<RowCount;i++)
    {
     distXM=Double.MAX_VALUE; 
     l=-1;
     n=0;
     for (j=0;j<k;j++)
       {
     l=greedy.distXY(SampleSet[i],c[j]);
     if (distXM>l)
      { 
     distXM=l;
     n=j;
      }
           }
     U[n][i]=1;
    }
    return U;
    }
    }