现在有iris数据表格式如下:
pl sl pw sw
2 3 5 8
3 5 4.5 8
2.5 4 4.5 7
....
....
请问怎么用fcm与k-means聚类算法实现对该数据的聚类,要求得出每个聚类的数目以及聚类的内容(如选择三个以下变量要求用二维或三维图形表示出结果)。实现一个算法,能正确实现的200分。
pl sl pw sw
2 3 5 8
3 5 4.5 8
2.5 4 4.5 7
....
....
请问怎么用fcm与k-means聚类算法实现对该数据的聚类,要求得出每个聚类的数目以及聚类的内容(如选择三个以下变量要求用二维或三维图形表示出结果)。实现一个算法,能正确实现的200分。
解决方案 »
- 想问一下TStrings存入元素时怎么覆盖掉相同元素?
- delphi TClientSocket的sendText()怎么捕获发送数据失败
- delphi中如何让选中的图片高亮
- 高分查错!TMemoryStream对象赋给TStream对象出错!
- 请问各位,谁有TURBO DELPHI的序列号和KEY?
- 我想问一下delphi里面的汉字怎么在别的软件里识别?
- 敬请高手出手解救!!!
- 我怎么知道现在都开了哪些端口?
- 用ado连接数据库后,需要在用户界面中改变路据库的路径及名称,请问用什么方式最好?
- 高手请进:关于delphi中利用Word模板的问题.
- 关于unicode类型数据
- 如何设置delphi全屏显示时候,热键弹出窗口不出现
第一段: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;
}
}
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;
}
}