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

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

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

 

Weka Version: 3.7.10

 

K-Means K-均值算法

Java代码   收藏代码
  1. import java.io.File;  
  2.   
  3. import weka.clusterers.SimpleKMeans;  
  4. import weka.core.DistanceFunction;  
  5. import weka.core.Instances;  
  6. import weka.core.converters.ArffLoader;  
  7.   
  8.   
  9. public class TestKMeans {  
  10.       
  11.     public static void main(String[] args) {  
  12.         Instances ins = null;  
  13.           
  14.         SimpleKMeans KM = null;  
  15.           
  16.         // 目前没有使用到,但是在3.7.10的版本之中可以指定距离算法  
  17.         // 默认是欧几里得距离  
  18.         DistanceFunction disFun = null;  
  19.           
  20.         try {  
  21.             // 读入样本数据  
  22.             File file = new File("D:\\Program Files\\Weka-3-7\\data\\contact-lenses.arff");  
  23.             ArffLoader loader = new ArffLoader();  
  24.             loader.setFile(file);  
  25.             ins = loader.getDataSet();  
  26.               
  27.             // 初始化聚类器 (加载算法)  
  28.             KM = new SimpleKMeans();  
  29.             KM.setNumClusters(2);       //设置聚类要得到的类别数量  
  30.             KM.buildClusterer(ins);     //开始进行聚类  
  31.               
  32.             // 打印聚类结果  
  33.             System.out.println(KM.toString());  
  34. //          for(String option : KM.getOptions()) {  
  35. //              System.out.println(option);  
  36. //          }  
  37. //          System.out.println("CentroIds:" + tempIns);  
  38.         } catch(Exception e) {  
  39.             e.printStackTrace();  
  40.         }  
  41.           
  42.     }  
  43. }  

 

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

 

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

Java代码   收藏代码
  1. EM em = null;  
  2. em = new EM();  
  3. // 使用交叉验证自动选择聚类数目  
  4. em.setNumClusters(-1);  
  5. em.setMaxIterations(100);  
  6. em.buildClusterer(ins);  

 

具体可以看源码:

Java代码   收藏代码
  1. /** 
  2.    * Set the number of clusters (-1 to select by CV). 
  3.    *  
  4.    * @param n the number of clusters 
  5.    * @throws Exception if n is 0 
  6.    */  
  7.   @Override  
  8.   public void setNumClusters(int n) throws Exception {  
  9.   
  10.     if (n == 0) {  
  11.       throw new Exception("Number of clusters must be > 0. (or -1 to "  
  12.           + "select by cross validation).");  
  13.     }  
  14.   
  15.     if (n < 0) {  
  16.       m_num_clusters = -1;  
  17.       m_initialNumClusters = -1;  
  18.     } else {  
  19.       m_num_clusters = n;  
  20.       m_initialNumClusters = n;  
  21.     }  
  22.   }  

 

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值