在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
结果:
(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";
(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 |