libsvm 지원 벡터 머신 알고리즘 패키지의 기본 사용은 지원 벡터 회귀 머신입니다.
다음과 같이 코드 코드를 복사합니다.
import java.io.BufferedReader;
java.io.파일 가져오기;
import java.io.FileReader;
import java.util.ArrayList;
java.util.List 가져오기;
libsvm.svm 가져오기;
libsvm.svm_model 가져오기;
libsvm.svm_node 가져오기;
libsvm.svm_parameter 가져오기;
libsvm.svm_problem 가져오기;
공개 클래스 SVM {
공개 정적 무효 메인(String[] args) {
// 훈련 세트 포인트 a{10.0, 10.0}과 포인트 b{-10.0, -10.0}을 정의하고 해당 라벨은 {1.0, -1.0}입니다.
List<Double> label = new ArrayList<Double>();
List<svm_node[]> nodeSet = new 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++) {
datas[i][j] = nodeSet.get(i)[j];
}
}
double[] labels = new double[label.size()] // a,b에 해당하는 라벨
for (int i = 0; i < labels.length; i++) {
labels[i] = label.get(i);
}
//svm_problem 객체 정의
svm_problem 문제 = 새로운 svm_problem();
문제.l = nodeSet.size(); // 벡터 개수
문제.x = 데이터; //훈련 세트 벡터 테이블
문제.y = lables; // 해당 lable 배열
//svm_parameter 객체 정의
svm_parameter param = 새로운 svm_parameter();
param.svm_type = svm_parameter.EPSILON_SVR;
param.kernel_type = svm_parameter.LINEAR;
param.cache_size = 100;
param.eps = 0.00001;
매개변수.C = 1.9;
//SVM 분류 모델 학습
System.out.println(svm.svm_check_parameter(problem, param));
// 매개변수에 문제가 없으면 svm.svm_check_parameter() 함수는 null을 반환하고, 그렇지 않으면 오류 설명을 반환합니다.
svm_model 모델 = svm.svm_train(problem, param);
// svm.svm_train()은 SVM 분류 모델을 훈련합니다.
// 테스트 데이터 가져오기
List<Double> testlabel = new ArrayList<Double>();
List<svm_node[]> testnodeSet = new 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[] testlabables = new double[testlabel.size()] // a,b에 해당하는 라벨
for (int i = 0; i < testlabs.length; i++) {
testlabels[i] = testlabel.get(i);
}
// 테스트 데이터 예측을 위한 라벨
이중 오류 = 0.0;
for (int i = 0; i < testdatas.length; i++) {
double truevalue = testlabables[i];
System.out.print(truevalue + " ");
double 예측값 = svm.svm_predict(model, testdatas[i]);
System.out.println(predictValue);
err += Math.abs(predictValue - truevalue);
}
System.out.println("err=" + err / datas.length);
}
공개 정적 무효 getData(List<svm_node[]> nodeSet, List<Double> 라벨,
문자열 파일명) {
노력하다 {
FileReader fr = new FileReader(새 파일(파일 이름));
BufferedReader br = new BufferedReader(fr);
문자열 라인 = null;
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();
node.index = i + 1;
node.value = Double.parseDouble(datas[i]);
벡터[i] = 노드;
}
nodeSet.add(벡터);
double lablevalue = Double.parseDouble(datas[datas.length - 1]);
label.add(lablevalue);
}
} 잡기(예외 e) {
e.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