新建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>>();