由模糊理论可知:R是X中的模糊相似关系,X=(x1,...xn),则R的n-1次运算后必是一个等价关系。运算定义如下:
[1,0.6,0.2 ,0]。0
=0.4
0.4
1
1
如图是个体间的相似关系矩阵:
等价关系
经过运算后的等价关系为:
取a=0.99得截集:
聚类结果:
源代码如下:
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();
}
}
}