Tôi đang cố gắng sử dụng các ràng buộc java cho libsvm:libsvm thi java
http://www.csie.ntu.edu.tw/~cjlin/libsvm/
tôi đã thực hiện một ví dụ 'tầm thường' mà có thể dễ dàng tuyến tính tách trong y. Dữ liệu được định nghĩa là:
double[][] train = new double[1000][];
double[][] test = new double[10][];
for (int i = 0; i < train.length; i++){
if (i+1 > (train.length/2)){ // 50% positive
double[] vals = {1,0,i+i};
train[i] = vals;
} else {
double[] vals = {0,0,i-i-i-2}; // 50% negative
train[i] = vals;
}
}
Trường hợp 'tính năng' đầu tiên là lớp và tập huấn được xác định tương tự.
Đào tạo mô hình:
private svm_model svmTrain() {
svm_problem prob = new svm_problem();
int dataCount = train.length;
prob.y = new double[dataCount];
prob.l = dataCount;
prob.x = new svm_node[dataCount][];
for (int i = 0; i < dataCount; i++){
double[] features = train[i];
prob.x[i] = new svm_node[features.length-1];
for (int j = 1; j < features.length; j++){
svm_node node = new svm_node();
node.index = j;
node.value = features[j];
prob.x[i][j-1] = node;
}
prob.y[i] = features[0];
}
svm_parameter param = new svm_parameter();
param.probability = 1;
param.gamma = 0.5;
param.nu = 0.5;
param.C = 1;
param.svm_type = svm_parameter.C_SVC;
param.kernel_type = svm_parameter.LINEAR;
param.cache_size = 20000;
param.eps = 0.001;
svm_model model = svm.svm_train(prob, param);
return model;
}
Sau đó, để đánh giá các mô hình tôi sử dụng:
public int evaluate(double[] features) {
svm_node node = new svm_node();
for (int i = 1; i < features.length; i++){
node.index = i;
node.value = features[i];
}
svm_node[] nodes = new svm_node[1];
nodes[0] = node;
int totalClasses = 2;
int[] labels = new int[totalClasses];
svm.svm_get_labels(_model,labels);
double[] prob_estimates = new double[totalClasses];
double v = svm.svm_predict_probability(_model, nodes, prob_estimates);
for (int i = 0; i < totalClasses; i++){
System.out.print("(" + labels[i] + ":" + prob_estimates[i] + ")");
}
System.out.println("(Actual:" + features[0] + " Prediction:" + v + ")");
return (int)v;
}
Trong trường hợp mảng trôi qua là một điểm từ tập thử nghiệm.
Các kết quả được luôn trở về lớp 0. Với những kết quả chính xác con người:
(0:0.9882998314585194)(1:0.011700168541480586)(Actual:0.0 Prediction:0.0)
(0:0.9883952943701599)(1:0.011604705629839989)(Actual:0.0 Prediction:0.0)
(0:0.9884899803606306)(1:0.011510019639369528)(Actual:0.0 Prediction:0.0)
(0:0.9885838957058696)(1:0.011416104294130458)(Actual:0.0 Prediction:0.0)
(0:0.9886770466322342)(1:0.011322953367765776)(Actual:0.0 Prediction:0.0)
(0:0.9870913229268679)(1:0.012908677073132284)(Actual:1.0 Prediction:0.0)
(0:0.9868781382588805)(1:0.013121861741119505)(Actual:1.0 Prediction:0.0)
(0:0.986661444476744)(1:0.013338555523255982)(Actual:1.0 Prediction:0.0)
(0:0.9864411843906802)(1:0.013558815609319848)(Actual:1.0 Prediction:0.0)
(0:0.9862172999068877)(1:0.013782700093112332)(Actual:1.0 Prediction:0.0)
Ai đó có thể giải thích tại sao phân loại này không hoạt động? Có một bước tôi đã làm rối tung, hoặc một bước tôi bị mất?
Cảm ơn
Bạn có thể giải thích sai sót trong mã câu hỏi là gì không? Tôi đang gặp vấn đề trong việc phát hiện lỗi! :( – Daniel