调用类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)的程度,细心的博友一定能观察到我好多地方用到了双次循环的操作了。