上一篇中我们实现了最小生成树算法,现在我们利用最小生成树来实现图论聚类。如果有一最小生成树如图:
最小生成树
剪枝后
聚类结果
我们要对以上六个点进行聚类,我们阈值为4,所以要剪掉权值大于等于4的边。剪掉后如图。聚类结果就是分三类。以下是代码实现:
public class Cluster {
private Graph g;
private MST ms;
public static void main(String[]args)
{
//为最小生成树建图
String path="F:\\java\\PictureCluster\\MSTdata.txt";
Graph g=new Graph();
MST ms=new MST();
ms.InitialGraph(g, path);
float temp=4;//阈值
for(int i=0;i
{
for(int j=0;j
{
if(g.arcs[i][j]
{
}
else
{
g.arcs[i][j]=100000;
}
}
}
//
List> datas = new
ArrayList>();
for(int i=0;i
{
Listlist=new ArrayList();
for(int j=0;j
{
if(g.arcs[i][j]!=100000)
list.add(g.vertex[j]);
}
datas.add(list);
}
for(int i=0;i
{
for(int j=0;j
System.out.print(datas.get(i).get(j)+" ");
System.out.println();
}
//分类
for(int i=0;i
{
for(int j=0;j
{
if (datas.get(i).contains(g.vertex[j]))
{
for(int k=0;k
{
if(!datas.get(i).contains(datas.get(j).get(k)))
{
datas.get(i).add(datas.get(j).get(k));
}
}
datas.get(j).clear();
}
}
}
System.out.println("聚类结果:");
for(int i=0;i
{
for(int j=0;j
System.out.print(datas.get(i).get(j));
System.out.println();
}
}
}
其实这其中比较麻烦的是当剪枝后,结果我们是知道的,但是如何存储及显示比较难。所以我们就用了list的List.遍历每一个点,比如与他有关联v3的加入他的List中,再遍历他的List,查看有v3,再将v3的list与他的list合并,迭代进行。