在这里将使用Weka自带的K-means以及EM算法对同一份数据进行聚类。
目前使用的是自带的数据集。我也不太清楚这样聚类的效果如何 sigh...
Weka Version: 3.7.10
K-Means K-均值算法
- importjava.io.File;
- importweka.clusterers.SimpleKMeans;
- importweka.core.DistanceFunction;
- importweka.core.Instances;
- importweka.core.converters.ArffLoader;
- publicclassTestKMeans{
- publicstaticvoidmain(String[]args){
- Instancesins=null;
- SimpleKMeansKM=null;
- //目前没有使用到,但是在3.7.10的版本之中可以指定距离算法
- //默认是欧几里得距离
- DistanceFunctiondisFun=null;
- try{
- //读入样本数据
- Filefile=newFile("D:\\ProgramFiles\\Weka-3-7\\data\\contact-lenses.arff");
- ArffLoaderloader=newArffLoader();
- loader.setFile(file);
- ins=loader.getDataSet();
- //初始化聚类器(加载算法)
- KM=newSimpleKMeans();
- KM.setNumClusters(2);//设置聚类要得到的类别数量
- KM.buildClusterer(ins);//开始进行聚类
- //打印聚类结果
- System.out.println(KM.toString());
- //for(Stringoption:KM.getOptions()){
- //System.out.println(option);
- //}
- //System.out.println("CentroIds:"+tempIns);
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
在上面的算法之中,使用的是SimpleKMeans这个类。
使用EM算法的方法几乎一样,唯一的不同就是在设置类数目的时候可以设置成-1. 如下:
- EMem=null;
- em=newEM();
- //使用交叉验证自动选择聚类数目
- em.setNumClusters(-1);
- em.setMaxIterations(100);
- em.buildClusterer(ins);
具体可以看源码:
- /**
- *Setthenumberofclusters(-1toselectbyCV).
- *
- *@paramnthenumberofclusters
- *@throwsExceptionifnis0
- */
- @Override
- publicvoidsetNumClusters(intn)throwsException{
- if(n==0){
- thrownewException("Numberofclustersmustbe>0.(or-1to"
- +"selectbycrossvalidation).");
- }
- if(n<0){
- m_num_clusters=-1;
- m_initialNumClusters=-1;
- }else{
- m_num_clusters=n;
- m_initialNumClusters=n;
- }
- }
关于EM 以及K-Means的具体描述,请自行百度吧~