在java中调用weka聚类方法并显示相应的类标签+weka中创建arff数据

1.读取arff文件

Instances data = new Instances(new BufferedReader(new FileReader("/some/where/data.arff")));
// setting class attribute
data.setClassIndex(data.numAttributes() - 1);

2.直接在程序中创建数据集

1)创建数据格式:

1numeric(数值型):Attribute numeric = new Attribute("name_of_attr");

2data(日期):Attribute date = new Attribute("name_of_attr", "yyyy-MM-dd");

3nominal(标称型):

ArrayList<String> labels = new ArrayList<String>();

labels.addElement("label_a");

labels.addElement("label_b");

labels.addElement("label_c");

labels.addElement("label_d");

Attribute nominal = new Attribute("name_of_attr", labels);

4stringAttribute string = new Attribute("name_of_attr", (ArrayList<String>)

null);

5)实例:创建一个关系relation(名字叫attributes),其中包含三个属性(两个个数值型,一个标称型包含yesno

//创建两个数值型
Attribute num1 = new Attribute("num1");
Attribute num2 = new Attribute("num2");
//创建一个标称型
ArrayList<String> labels = new ArrayList<String>();
labels.add("no");
labels.add("yes");
Attribute cls = new Attribute("class", labels);
//创建一个relation关系
ArrayList<Attribute> attributes = new ArrayList<Attribute>();
attributes.add(num1);
attributes.add(num2);
attributes.add(cls);
//把创建的格式应用在数据集中
Instances dataset = new Instances("Test-dataset", attributes, 0);
//如果知道数据有多少行,就可以不用0

结果:


(2)添加数据

1)创建一个数组

double[] values = new double[data.numAttributes()];

2)添加相应的数据

numeric just sets the numeric value:

values[0] = 1.23;

date turns the date string into a double value:

values[1] = data.attribute(1).parseDate("2001-11-09");

nominal determines the index of the label:

values[2] = data.attribute(2).indexOf("label_b");

string determines the index of the string, using the addStringValue method (internally, a hashtable holds all the string values):

values[3] = data.attribute(3).addStringValue("This is a string");

relational

Instances dataRel = new Instances(data.attribute(4).relation(),0);

valuesRel = new double[dataRel.numAttributes()];

valuesRel[0] = 2.34;

valuesRel[1] = dataRel.attribute(1).indexOf("val_C");

dataRel.add(new DenseInstance(1.0, valuesRel));

values[4] = data.attribute(4).addRelation(dataRel);

 

例子:创建一个atff文件格式

                /**
		 * 1.创建数据格式
		 */
		//创建两个数值型
		Attribute num1 = new Attribute("num1");
		Attribute num2 = new Attribute("num2");
		//创建一个标称型
		ArrayList<String> labels = new ArrayList<String>();
		labels.add("no");
		labels.add("yes");
		Attribute cls = new Attribute("class", labels);
		//创建一个relation关系
		ArrayList<Attribute> attributes = new ArrayList<Attribute>();
		attributes.add(num1);
		attributes.add(num2);
		attributes.add(cls);
		//把创建的格式应用在数据集中
		//如果知道数据有多少行,就可以不用0
		Instances dataset = new Instances("Test-dataset", attributes, 0);
		
		/**
		 * 2.添加数据(第一行)
		 */
		double[] values = new double[dataset.numAttributes()];
		values[0] = 1.23;
		values[1] = 2;
		values[2] = dataset.attribute(2).indexOfValue("yes");
		dataset.add(new DenseInstance(1.0, values));
		
		/**
		 * 2.添加数据(第二行)
		 */
		values=new double[dataset.numAttributes()];
		values[0] = 10.23;
		values[1] = 100;
		values[2] = dataset.attribute(2).indexOfValue("no");
		dataset.add(new DenseInstance(1.0, values));
		System.out.println(dataset);

结果:



3.生成一个arff文件

import weka.datagenerators.DataGenerator;
import weka.datagenerators.classifiers.classification.RDG1;
...
// configure generator
RDG1 generator = new RDG1();
generator.setMaxRuleSize(5);
// set where to write output to
java.io.PrintWriter output = new java.io.PrintWriter(
new java.io.BufferedWriter(new java.io.FileWriter("rdg1.arff")));
generator.setOutput(output);
DataGenerator.makeData(generator, generator.getOptions());
output.flush();
output.close();

4.参数设置

1手工建立一个String数组

String[] options = new String[2];

options[0] = "-R";

options[1] = "1";

2weka.core.Utils类中的函数splitOptions将一个命令行字符串转换成一下数组

String[] options = weka.core.Utils.splitOptions("-R 1");


5.聚类方法

(1)实现方法

Instances data = ... // from somewhere

String[] options = new String[2];

options[0] = "-I"; // max. iterations

options[1] = "100";

EM clusterer = new EM(); // new instance of clusterer

clusterer.setOptions(options); // set the options

clusterer.buildClusterer(data); // build the clusterer


(2)评价聚类的标准(用来确定该聚类方法是否是好的)

使用ClusterEvaluation类

Instances data = ... // from somewhere

EM cl = new EM();

cl.buildClusterer(data);

ClusterEvaluation eval = new ClusterEvaluation();

eval.setClusterer(cl);

eval.evaluateClusterer(new Instances(data));

System.out.println(eval.clusterResultsToString());

 

例子:实现KMeans算法

/**
		 * 5.实现聚类方法
		 */
		String[] option=new String[4];	//设置相应的参数
		option[0]="-N";	//聚类数
		option[1]="2";
		option[2]="-I";	//最大迭代次数
		option[3]="500";
		SimpleKMeans kmeans = new SimpleKMeans(); // new instance of clusterer
		kmeans.setOptions(option); // set the options
		kmeans.buildClusterer(dataset); // build the clusterer
		
		/**
		 * 6.评价聚类,使用ClusterEvaluation
		 */
		ClusterEvaluation eval = new ClusterEvaluation();
		eval.setClusterer(kmeans);
		eval.evaluateClusterer(new Instances(dataset));
		System.out.println(eval.clusterResultsToString());

6.保存数据(可以保存成arffcsv文件)

// data structure to save

Instances data = ...

// save as ARFF

DataSink.write("/some/where/data.arff", data);

// save as CSV

DataSink.write("/some/where/data.csv", data);


7.获取聚类的编号

                /**
		 * 6.评价聚类,使用ClusterEvaluation
		 */
		ClusterEvaluation eval = new ClusterEvaluation();
		eval.setClusterer(kmeans);
		eval.evaluateClusterer(new Instances(dataset));
		System.out.println(eval.clusterResultsToString());
		
		/**
		 * 7.每个实例的所属类别
		 */
		for(int i=0;i<eval.getClusterAssignments().length;i++){
			System.out.println(eval.getClusterAssignments()[i]);
		}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛克-李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值