Базовое использование пакета алгоритмов машины опорных векторов libsvm. Здесь демонстрируется машина регрессии опорных векторов.
Скопируйте код кода следующим образом:
импортировать java.io.BufferedReader;
импортировать java.io.File;
импортировать java.io.FileReader;
импортировать java.util.ArrayList;
импортировать java.util.List;
импортировать libsvm.svm;
импортировать libsvm.svm_model;
импортировать libsvm.svm_node;
импортировать libsvm.svm_parameter;
импортировать libsvm.svm_problem;
общественный класс SVM {
public static void main(String[] args) {
// Определите точку обучающего набора a{10.0, 10.0} и точку b{-10.0, -10.0}, а соответствующая метка – {1.0, -1.0}
Метка List<Double> = новый ArrayList<Double>();
List<svm_node[]> nodeSet = новый ArrayList<svm_node[]>();
getData(nodeSet, label, "file/train.txt");
int dataRange = nodeSet.get(0).length;
svm_node[][] datas = new svm_node[nodeSet.size()][dataRange]; // Таблица векторов обучающего набора;
for (int i = 0; i <datas.length; i++) {
for (int j = 0; j <dataRange; j++) {
данные[i][j] = nodeSet.get(i)[j];
}
}
double[] labels = new double[label.size()] // метки, соответствующие a,b
for (int i = 0; i < labels.length; i++) {
метки [я] = label.get (я);
}
//Определяем объект svm_problem
проблема svm_problem = новая svm_problem();
проблема.l = nodeSet.size(); // Количество векторов
проблема.x = datas //Таблица векторов обучающего набора;
проблема.y = lables // Соответствующий массив меток
//Определяем объект svm_parameter
параметр svm_parameter = новый svm_parameter();
param.svm_type = svm_parameter.EPSILON_SVR;
param.kernel_type = svm_parameter.LINEAR;
param.cache_size = 100;
параметр.eps = 0,00001;
параметр.С = 1,9;
//Обучаем классификационную модель SVM
System.out.println(svm.svm_check_parameter(проблема, параметр));
// Если проблем с параметрами нет, функция svm.svm_check_parameter() возвращает значение null, в противном случае возвращает описание ошибки.
модель svm_model = svm.svm_train(проблема, параметр);
// svm.svm_train() обучает модель классификации SVM
// Получаем тестовые данные
List<Double> testlabel = новый ArrayList<Double>();
List<svm_node[]> testnodeSet = новый ArrayList<svm_node[]>();
getData(testnodeSet, testlabel, "file/test.txt");
svm_node[][] testdatas = new svm_node[testnodeSet.size()][dataRange] // Таблица векторов обучающего набора;
for (int i = 0; i <testdatas.length; i++) {
for (int j = 0; j <dataRange; j++) {
testdatas[i][j] = testnodeSet.get(i)[j];
}
}
double[] testlables = new double[testlabel.size()] // метки, соответствующие a,b
for (int i = 0; i <testables.length; i++) {
testlabels[i] = testlabel.get(i);
}
// Метка для прогнозирования тестовых данных
двойная ошибка = 0,0;
for (int i = 0; i <testdatas.length; i++) {
двойное истинное значение = testtables[i];
System.out.print(truevalue + " ");
double PredictValue = svm.svm_predict(модель, testdatas[i]);
System.out.println(predictValue);
err += Math.abs(predictValue - truevalue);
}
System.out.println("err=" + err/datas.length);
}
public static void getData(List<svm_node[]> nodeSet, метка List<Double>,
Строковое имя файла) {
пытаться {
FileReader fr = новый FileReader (новый файл (имя файла));
BufferedReader br = новый BufferedReader (fr);
Строковая линия = ноль;
while ((line = br.readLine()) != null) {
String[] datas = line.split(",");
svm_node[] вектор = новый svm_node[datas.length - 1];
for (int i = 0; i <datas.length - 1; i++) {
узел svm_node = новый svm_node();
узел.индекс = я + 1;
node.value = Double.parseDouble(datas[i]);
вектор [я] = узел;
}
nodeSet.add(вектор);
double lablevalue = Double.parseDouble(datas[datas.length - 1]);
label.add(значение_таблицы);
}
} catch (Исключение е) {
е.printStackTrace();
}
}
}
Данные обучения, последний столбец — целевое значение.
Скопируйте код кода следующим образом:
17.6,17.7,17.7,17.7,17.8
17.7,17.7,17.7,17.8,17.8
17.7,17.7,17.8,17.8,17.9
17.7,17.8,17.8,17.9,18
17.8,17.8,17.9,18,18.1
17.8,17.9,18,18.1,18.2
17.9,18,18.1,18.2,18.4
18,18.1,18.2,18.4,18.6
18.1,18.2,18.4,18.6,18.7
18.2,18.4,18.6,18.7,18.9
18.4,18.6,18.7,18.9,19.1
18.6,18.7,18.9,19.1,19.3
данные испытаний
Скопируйте код кода следующим образом:
18.7,18.9,19.1,19.3,19.6
18.9,19.1,19.3,19.6,19.9
19.1,19.3,19.6,19.9,20.2
19.3,19.6,19.9,20.2,20.6
19.6,19.9,20.2,20.6,21
19.9,20.2,20.6,21,21.5
20.2,20.6,21,21.5,22