怎么用delphi实现k-means与fcm聚类算法(200分)

  • 主题发起人 主题发起人 独钓寒江
  • 开始时间 开始时间

独钓寒江

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有iris数据表格式如下:
pl sl pw sw
2 3 5 8
3 5 4.5 8
2.5 4 4.5 7
....
....
请问怎么用fcm与k-means聚类算法实现对该数据的聚类,要求得出每个聚类的数目以及聚类的内容(如选择三个以下变量要求用二维或三维图形表示出结果)。实现一个算法,能正确实现的200分。
 
怎么没人回答呀?
 
翻译下面Java为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=-1;
Random rnd = new Random ()
//产生一个随机数,作为N1
M[0]=rnd.nextInt(RowCount)
//选取随机点

double dist[]=new double[RowCount];
for (i=0;i<RowCount;i++) dist=Double.MAX_VALUE;
dist=d(SampleSet,M,M[0],dist);
for (i=1;i<k;i++)
{
Newi=Nexti(dist,M);
M=Newi;
dist=d(SampleSet,M,M,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 &amp;&amp
!xinm(i,M))
{
j=dist;
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=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-y)*(x-y);
dist=Math.sqrt(dist);
return dist;
}

public boolean xinm(int x,int M[])
{
for (int i=0;i<M.length;i++)
{
if (x==M) 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=SampleSet[M];

while (true)
{
for (i=0;i<k;i++)
for (j=0;j<RowCount;j++)
U[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,ReC);
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[j]==0) continue;
n++;
for (r=0;r<dim;r++)
s[r]+=SampleSet[j][r];
}
for(r=0;r<dim;r++)
{
ReC[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,c[j]);
if (distXM>l)
{
distXM=l;
n=j;
}
}
U[n]=1;
}
return U;
}
}
 
大家都不明白你说的是什么东西,不明白,当然不能瞎说了
 
刚学数据挖掘,k-means与fcm是两种聚类算法。
 
看来无望了
 
曲高和寡。
不懂,惭愧中。
 
看来现在delphi人才确实不如前两年啦!
 
自己完成了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部