• weka使用笔记1cluster内方法的使用


    weka提供了11种聚类算法,常用的有kmeans 和EM,weka的simpleKmeans是最简单的聚类方法,距离是计算欧几里德距离,但是新版本的weka是可以置入自己的计算距离的公式的。EM聚类的效率很低,建议如果不是实验情况,不要使用。

    主要说一下simpleKmeans聚类。SimpleKmeans聚类参数很简单,这里不再赘述,文档里面写的很清楚。用图形界面的情况下,聚类之后,在左下方的result list栏里,右键,有很多选项,其中visualize cluster assignment可以看聚类之后的结果,在这个visualize界面,有一个save,是可以把类标号添加到每一行数据的,如果数据里面有用户ID的话,那这个就可以把每个用户ID和这个用户所在的类提取出来,很方便,生成的也是.arff文件。

    但是在命令行模式下,没有办法得到这个类标号,只能得到一个很简单的数据,所以只能用编程实现了。

    在一个工程内引用weka.jar之后就能用weka的接口了,非常方便.废话不说,直接上代码:

    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    
    import weka.clusterers.SimpleKMeans;
    import weka.clusterers.ClusterEvaluation;
    import weka.core.Instances;
    import weka.core.converters.ArffLoader;
    
    public class Kmeans {
    
    	public static void startCluster(String inputfilename,String outputfilename) {
    		Instances ins = null;
    		SimpleKMeans KM = null;
    		ClusterEvaluation cl = null;
    		File file = new File(inputfilename);
    		ArffLoader loader = new ArffLoader();
    		File f = new File(outputfilename);
    		try {
    			cl = new ClusterEvaluation();	
    			loader.setFile(file);
    			ins = loader.getDataSet();
    			ins.deleteAttributeAt(0);//忽略第一列
    			KM = new SimpleKMeans();
    
    			KM.setNumClusters(15);
    			KM.buildClusterer(ins);	
    			cl.setClusterer(KM);
    			cl.evaluateClusterer(new Instances(ins));
    			double[] d = cl.getClusterAssignments();//得到每一列的类标号
    			
    			if (f.exists()) {
    				System.out.print("cunzai");
    			} else {
    				System.out.print("bucunzai");
    				f.createNewFile();
    			}
    			BufferedWriter output = new BufferedWriter(new FileWriter(f));
    			String dataline = "";
    			output.write(cl.clusterResultsToString());//就是聚类之后打印出来的聚类结果
    			for(int i = 0 ; i < d.length;i++){
    				dataline = d[i]+"";
    				output.write(dataline);
    				output.newLine();
    				System.out.println(dataline);
    			}
    			
    			output.close();
    
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    

      然后打上jar包就能运行了,上面代码只是得到了一个简单的类标号,还可以根据自己的需要输出更多的数据。

  • 相关阅读:
    MPF源码分析之资源文件加载
    oracle存储过程代码日志记录
    fix8源码分析之日志模块
    oracle日期转整数
    记录OCI操作一个诡异的问题
    记录一个虚拟机重启网络启动失败问题
    buff占用内存高
    MFC程序编译链接问题汇总一
    回调函数模型设计
    利用call与apply向函数传递参数
  • 原文地址:https://www.cnblogs.com/fbiswt/p/2737449.html
Copyright © 2020-2023  润新知