java 实现自动聚类算法,利用等价关系的聚类算法java实现

由模糊理论可知:R是X中的模糊相似关系,X=(x1,...xn),则R的n-1次运算后必是一个等价关系。运算定义如下:

[1,0.6,0.2 ,0]。0

=0.4

0.4

1​

1​

a4c26d1e5885305701be709a3d33442f.png

如图是个体间的相似关系矩阵:

a4c26d1e5885305701be709a3d33442f.png等价关系

经过运算后的等价关系为:

​取a=0.99得截集:

a4c26d1e5885305701be709a3d33442f.png

​聚类结果:

a4c26d1e5885305701be709a3d33442f.png

源代码如下:

public class RelationshipCluster {

public static  void read(List>

datas, String path)

{

try {

BufferedReader br = new

BufferedReader(new FileReader(new File(path)));

String reader =

br.readLine();

while (reader !=

null)

{

String t[]

= reader.split(" ");

ArrayList

list = new ArrayList();

for (int i

= 0; i < t.length; i++)

{

list.add(t[i]);

}

datas.add(list);

reader =

br.readLine();

}

}

catch (Exception

e)

{

e.printStackTrace();

}

}

public static int CompareTo(float[][] data1,float[][] data2)

{

if(data1.length!=data2.length)

{

return -1;

}

else

{

for (int i = 0; i < data1.length; i++)

{

for (int j = 0; j < data1.length;

j++)

{

if(data1[i][j]!=data2[i][j])

return -1;

}

}

return 1;

}

}

public static float SelectMax(float[] fl)

{

float temp=fl[0];

for(int i=1;i

{

if(fl[i]>temp)

temp=fl[i];

}

return temp;

}

//将列表转化为矩阵

public static float[][] Convert(List>data)

{

//将列表变为矩阵

float [][] arc=new float[data.size()][data.size()];

for (int i = 0; i < data.size(); i++)

{

List test1 = data.get(i);

for (int j = 0; j < test1.size();

j++)

{

arc[i][j]=Float.parseFloat(test1.get(j));

}

}

return arc;

}

public static  List>

ConvertToList(float[][]data)

{

//将矩阵变为列表

List> datas1 = new

ArrayList>();

//float [][] arc=new float[data.length][data.length];

for (int i = 0; i < data.length; i++)

{

List test1 = new ArrayList();

for (int j = 0; j <

data[i].length; j++)

{

test1.add(data[i][j]);

}

datas1.add(test1);

}

return datas1;

}

public static float[][] Operate(float[][]arc)

{

//结果矩阵

float [][] result=new float[arc.length][arc.length];

for(int i=0;i

{

for(int j=0;j

{

float []temp=new float[arc.length];

for(int k=0;k

{

if(arc[i][k]

{

temp[k]=arc[i][k];

}

else

{

temp[k]=arc[k][j];

}

}

result[i][j]=SelectMax(temp);//向新数组中存值

}

}

return result;

}

public static void Standard(float[][] data,float temp)

{

for(int i=0;i

for(int j=0;j

{

if (data[i][j]>=temp)

data[i][j]=1;

else

data[i][j]=0;

}

}

public static void main(String[]args)

{

//将原始相似性矩阵读入datas1

String datafile1="F:\\java\\FuzzyRelationship\\data1.txt";

List> datas1 = new

ArrayList>();

read(datas1,datafile1);

float [][]OrginalMartix=Convert(datas1);

//进行关系合成

for(int i=0;i

{

float[][]after=Operate(OrginalMartix);

int f=CompareTo(after,OrginalMartix);

if(f==1)

break;

else

{

OrginalMartix=after;

}

}

float a=(float) 0.99;

for(int i=0;i

{

for(int j=0;j

{

System.out.print(OrginalMartix[i][j]+" ");

}

System.out.println();

}

Standard(OrginalMartix,a);

for(int i=0;i

{

for(int j=0;j

{

System.out.print(OrginalMartix[i][j]+" ");

}

System.out.println();

}

List> data=ConvertToList(OrginalMartix);

List> clusterResult = new

ArrayList>();

//将有关系的点加入各自的列表中

for(int i=0;i

{

Listlist=new ArrayList();

for(int j=0;j

{

if(OrginalMartix[i][j]!=0)

list.add(j);

}

clusterResult.add(list);

}

for(int i=0;i

{

for(int j=0;j

{

if

((i!=j)&&clusterResult.get(i).contains(j))

{

for(int k=0;k

{

if(!clusterResult.get(i).contains(clusterResult.get(j).get(k)))

{

clusterResult.get(i).add(clusterResult.get(j).get(k));

}

}

clusterResult.get(j).clear();

clusterResult.remove(j);

}

}

}

System.out.println("聚类结果:");

for(int i=0;i

{

System.out.println("第"+i+"类");

for(int j=0;j

System.out.print(clusterResult.get(i).get(j));

System.out.println();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值