s) {
System.out.print(MessageFormat.format("({0}, {1}) ", p.x, p.y));
}
System.out.println();
i++;
}
}
/**
* 创建聚簇
*/
public void buildCluster() {
// 第一阶段形成小聚簇
connectedGraph();
searchSmallCluster();
System.out.println("第一阶段形成的小簇集合:");
printClusters(initClusters);
// 第二阶段根据RI和RC的值合并小聚簇形成最终结果聚簇
combineSubClusters();
System.out.println("最终的聚簇集合:");
printClusters(resultClusters);
}
}
调用类Client.java:
?
?
package DataMining_Chameleon;
/**
* Chameleon(变色龙)两阶段聚类算法
* @author lyq
*
*/
public class Client {
public static void main(String[] args){
String filePath = "C:\\Users\\lyq\\Desktop\\icon\\graphData.txt";
//k-近邻的k设置
int k = 1;
//度量函数阈值
double minMetric = 0.1;
ChameleonTool tool = new ChameleonTool(filePath, k, minMetric);
tool.buildCluster();
}
}
?
算法输出如下:
?
第一阶段形成的小簇集合:
聚簇1:(2, 2) (3, 1) (3, 4) (5, 3)
聚簇2:(3, 14) (10, 14) (11, 13)
聚簇3:(8, 3) (10, 4)
聚簇4:(8, 6) (9, 8) (10, 7) (12, 8) (10, 10)
聚簇5:(12, 15) (14, 15)
聚簇6:(14, 7) (15, 8) (14, 9)
最终的聚簇集合:
聚簇1:(2, 2) (3, 1) (3, 4) (5, 3) (8, 3) (10, 4)
聚簇2:(3, 14) (10, 14) (11, 13) (12, 15) (14, 15)
聚簇3:(8, 6) (9, 8) (10, 7) (12, 8) (10, 10) (14, 7) (15, 8) (14, 9)
?
图形展示情况如下:
首先是第一阶段形成小簇集的结果:

然后是第二阶段合并的结果:

与结果相对应,请读者细细比较。
算法总结
在算法的实现过程中遇到一个比较大的困惑点在于2个簇近和并的时候,合并边的选取,我是直接采用的是最近的2对顶点进行连接,显然这是不合理的,当簇与簇规模比较大的时候,这个连接边需要变多,我有想过做一个计算函数,帮我计算估计要连接几条边。这里再提几点变色龙算法的优缺点,首先是这个算法将互连性和近似性都考虑了进来,其次他能发现高质量的任意形状的簇,问题有,第一与KNN算法一样,这个k的取值永远是一个痛,时间复杂度高,有可能会达到O(n*n)的程度,细心的博友一定能观察到我好多地方用到了双次循环的操作了。