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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


1.读取arff文件


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


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

(1)创建数据格式:

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

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

3)nominal(标称型):

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);

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

null);

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

//创建两个数值型
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

结果:



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


(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);


结果:



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



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";

(2)用weka.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.保存数据(可以保存成arff和csv文件)

// 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]);
		}




阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java