1.pom.xml引入依赖
<dependency>
<groupId>nz.ac.waikato.cms.weka</groupId>
<artifactId>LibSVM</artifactId>
<version>1.0.10</version>
</dependency>
2.样例代码
import weka.classifiers.functions.LibSVM;
import weka.core.*;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.NumericToNominal;
import java.util.ArrayList;
import java.util.Arrays;
public class OneClassSVMExample {
public static void main(String[] args) throws Exception {
// Create the attributes
Attribute attribute1 = new Attribute("att1");
Attribute attribute2 = new Attribute("att2");
Attribute classAttribute = new Attribute("class");
// Create the instances
Instances trainData = new Instances("trainData", new ArrayList<>(Arrays.asList(attribute1, attribute2, classAttribute)), 0);
Instances testData = new Instances("testData", new ArrayList<>(Arrays.asList(attribute1, attribute2, classAttribute)), 0);
// Add the training instances
Instance trainInstance1 = new DenseInstance(1.0, new double[]{1.0, 2.0, 1.0});
Instance trainInstance2 = new DenseInstance(1.0, new double[]{2.0, 3.0, 1.0});
Instance trainInstance3 = new DenseInstance(1.0, new double[]{3.0, 4.0, 1.0});
trainData.add(trainInstance1);
trainData.add(trainInstance2);
trainData.add(trainInstance3);
// Add the testing instances
Instance testInstance1 = new DenseInstance(1.0, new double[]{1.5, 2.5, 0.0});
Instance testInstance2 = new DenseInstance(1.0, new double[]{121.5, 131.5, 233.0});
Instance testInstance3 = new DenseInstance(1.0, new double[]{2.5, 2.5, 1.0});
testData.add(testInstance1);
testData.add(testInstance2);
testData.add(testInstance3);
// Convert the numeric class attribute to a nominal attribute
NumericToNominal convert = new NumericToNominal();
convert.setAttributeIndices("last");
convert.setInputFormat(trainData);
trainData = Filter.useFilter(trainData, convert);
// Set the class index
trainData.setClassIndex(trainData.numAttributes() - 1);
testData.setClassIndex(testData.numAttributes() - 1);
// Create and build the OneClassSVM model
LibSVM svm = new LibSVM();
String[] options = new String[6];
options[0] = "-S";
options[1] = "2";
options[2] = "-K";
options[3] = "2";
options[4] = "-G";
options[5] = "0.05";
svm.setOptions(options);
svm.buildClassifier(trainData);
// Classify the test instances
for (Instance instance : testData) {
double score = svm.classifyInstance(instance);
System.out.println(score);
}
}
}