weka中,如何使用EM聚类,并导出聚类结果

来源:互联网 发布:淘宝店链接地址 编辑:程序博客网 时间:2024/05/17 09:08

新建Eclipse工程,下载weka.jar包,导入工程,新建class类,创建main函数,这些都不用说了吧!

首先准备数据

官方文本格式为arff,个人原因选择TXT格式,这个不必纠结!

新建txt文本,格式为ANSI,接下来文件内容格式:
@relation 作者
@attribute 特征名称 特征属性
@data
第一个特征值,第二个特征值,……

备注:①个人认为relation不是很重要,但是为了不必要的麻烦,可以写一下。
②attribute为特征,如果你的样本用k个特征表示,那么就有k行@attribute。
③data后面写每个样本的特征向量,中间用英文逗号隔开。
④特征属性可以为实数,可以为bool值,可以为string,
⑤特征属性有四种基本类型

numeric                     数值型 <nominal-specification>     分类(nominal)型 string                      字符串型 date [<date-format>]        日期和时间型

注意“integer”,“real”,“numeric”,“date”,“string”这些关键字是区分大小写的,而“relation”“attribute ”和“date”则不区分。

具体数据格式可以看博客:http://blog.csdn.net/buaalei/article/details/7103055

准备好数据就可以写代码了!!

Instances ins = null;//用来存放样本EM em = null;//聚类模型int classnum=400;//聚类数目try {// 读入样本数据    File file = new File("D:/f.txt");//准备刚才的数据    ArffLoader loader = new ArffLoader();//weka自带的数据读取类    loader.setFile(file);//读入文件    ins = loader.getDataSet();//获取样本// 初始化聚类器 (加载算法)    em = new EM();//初始化聚类器    em.setNumClusters(classnum); // 设置聚类要得到的类别数量    em.buildClusterer(ins); // 开始进行聚类// 打印聚类结果    ClusterEvaluation evaluation=new ClusterEvaluation();//聚类评估器    evaluation.setClusterer(em);//设置需要评估的聚类器    evaluation.evaluateClusterer(new Instances(ins));//设置样本    double[] cnum=evaluation.getClusterAssignments();//获取每个样本聚类后所属类别    //System.out.println(KM.toString());//输出每个簇的簇中心} catch (Exception e) {    e.printStackTrace();}

基础代码就是这些,想要输出聚类后每个簇有哪些样本,需要自己根据实际情况写代码。cnum标记了每个每个样本所属的类簇,且顺序是与data(代码中为f.txt)后的数据顺序是一致的。

如果问我我是怎么输出聚簇结果,那我说说我的思路吧!我有一个分词文件,里面是每个样本分词结果!data文件(f.txt)中每个样本的特征向量就是基于原始样本分词结果生成的,分词文件(里面是文本)与data文件(里面有特征向量)中的样本顺序是保持一致的,这样我只需要读入分词文件中的每一个样本,并用cnum做标记,然后用Map进行分类,进行输出,就可以得到最后聚类的结果!

Map<Double,List<String>> result=new HashMap<Double,List<String>>();