Weka聚类算法的两个实现算法

来源:互联网 发布:sql语句查询所有库存 编辑:程序博客网 时间:2024/05/21 06:20

这是转自博友的博客,讲解了java调用weka两种聚类算法的demo,在调用之前,必须下载weka jar包导入eclipse里面,并下载weka自带的数据集 进行测试;

本人只是进行了简单的测试,发现算法可以完美调用,但是算法的精髓还有待深入理解;

转载自:http://rangerwolf.iteye.com/blog/2012208


在这里将使用Weka自带的K-means以及EM算法对同一份数据进行聚类。

目前使用的是自带的数据集。我也不太清楚这样聚类的效果如何 sigh...

 

Weka Version: 3.7.10

 

K-Means K-均值算法

Java代码  收藏代码

import java.io.File;

import weka.clusterers.SimpleKMeans;
import weka.core.DistanceFunction;
import weka.core.Instances;
import weka.core.converters.ArffLoader;


public class TestKMeans {
    
    public static void main(String[] args) {
        Instances ins = null;
        
        SimpleKMeans KM = null;
        
        // 目前没有使用到,但是在3.7.10的版本之中可以指定距离算法
        // 默认是欧几里得距离
        DistanceFunction disFun = null;
        
        try {
            // 读入样本数据
            File file = new File("D:\\Program Files\\Weka-3-7\\data\\contact-lenses.arff");
            ArffLoader loader = new ArffLoader();
            loader.setFile(file);
            ins = loader.getDataSet();
            
            // 初始化聚类器 (加载算法)
            KM = new SimpleKMeans();
            KM.setNumClusters(2);         //设置聚类要得到的类别数量
            KM.buildClusterer(ins);        //开始进行聚类
            
            // 打印聚类结果
            System.out.println(KM.toString());
//            for(String option : KM.getOptions()) {
//                System.out.println(option);
//            }
//            System.out.println("CentroIds:" + tempIns);
        } catch(Exception e) {
            e.printStackTrace();
        }
        
    }
}

在上面的算法之中,使用的是SimpleKMeans这个类。

 

使用EM算法的方法几乎一样,唯一的不同就是在设置类数目的时候可以设置成-1. 如下:

Java代码  收藏代码

EM em = null;
em = new EM();
// 使用交叉验证自动选择聚类数目
em.setNumClusters(-1);
em.setMaxIterations(100);
em.buildClusterer(ins);

具体可以看源码:

Java代码  收藏代码

/**
   * Set the number of clusters (-1 to select by CV).
   *
   * @param n the number of clusters
   * @throws Exception if n is 0
   */
  @Override
  public void setNumClusters(int n) throws Exception {

    if (n == 0) {
      throw new Exception("Number of clusters must be > 0. (or -1 to "
          + "select by cross validation).");
    }

    if (n < 0) {
      m_num_clusters = -1;
      m_initialNumClusters = -1;
    } else {
      m_num_clusters = n;
      m_initialNumClusters = n;
    }
  }

关于EM 以及K-Means的具体描述,请自行百度吧~



0 0
原创粉丝点击