在使用svm中遇到的问题与解决,首先下面的代码是没有实现的(但逻辑是没有问题的,只是svm_predict不支持核2,3,4)
String path = Environment.getExternalStorageDirectory().toString()+ File.separator + fileDir;
String test_path = path + "/test3.txt";
String output_path = path + "/result.txt";
String model_name = path + "/my_model2.txt";
String[] testArgs = {test_path, model_name, output_path};
svm_model model;
model=svm.svm_load_model(model_name);
svm_node[] test = new svm_node[]{new svm_node()};
for(int l=0;l<15;l++){
test[0].index = i;
test[0].value = features[featuren-1][l];
}
svm_predict predict = new svm_predict();
//double result_normal = svm.svm_predict.//svm_predict(model_name, test_path);
System.out.println("++++++++++++++++++++++++++++++++++++++SVM predict");
double[] l = new double[2];
double pred_result = svm.svm_predict_probability(model, test,l);
System.out.print("pred_result----->");System.out.println(pred_result);
这里读源码可以看到svm_predict可以支持哪些核如下
var0.param.svm_type != 2 && var0.param.svm_type != 3 && var0.param.svm_type != 4,这些核都是不支持的
0 -- C-SVC (多类分类) 1 -- nu-SVC (多类分类)核可以支持
所以当遇到对应核无法实现的时候,可以使用接下来的方法,将数据保存到TXT(test3.txt)文件中,使用文件的方式对数据进行测试。(注意我这里已经训练好了,与训练有关的参数都没有使用,但是为了方便大家可能的学习,还是保留下来了)
我们解决这个问题无非是想实时调用,而不是只是显示在result.txt或者桌面上,所以接下来进行一个参数的追踪(就是显示在System.out中的正确率=90%(9/10),这个9就是我们要的数字,就是当前测试集中正确的个数,如果为1个,那就是这个样例的测试结果)
String path = Environment.getExternalStorageDirectory().toString()+ File.separator + fileDir;
/*File file3 = new File(path,"/test.csv");
BufferedWriter bw3 = new BufferedWriter(new FileWriter(file3,true));
bw3.write("s");
bw3.close();
System.out.println("file3");*/
String train_path = path + "/1015c.txt";
String test_path = path + "/test3.txt";
String output_path = path + "/result.txt";
String model_name = path + "/my_model2.txt";
//String[] trainArgs = {train_path, model_name};//、、"-s 2 -t 2 -n 0.01"关于参数可以在train。Java中直接进行修改,这里就不操作了
String[] testArgs = {test_path, model_name, output_path};
//______svm_train train = new svm_train();
svm_predict predict = new svm_predict();
//double result_normal = svm.svm_predict.//svm_predict(model_name, test_path);
System.out.println("++++++++++++++++++++++++++++++++++++++SVM predict");
//______train.main(trainArgs);
predict.main(testArgs);
之后在svm_predict.java中对其中的参数进行引用,可以将这个结果拿出来作为其他.java的使用
//**********svm——predict 112行左右
if(svm_type == svm_parameter.EPSILON_SVR ||
svm_type == svm_parameter.NU_SVR)
{
svm_predict.info("Mean squared error = "+error/total+" (regression)\n");
svm_predict.info("Squared correlation coefficient = "+
((total*sumvy-sumv*sumy)*(total*sumvy-sumv*sumy))/
((total*sumvv-sumv*sumv)*(total*sumyy-sumy*sumy))+
" (regression)\n");
}
else
MainActivity.correctnn(correct);
//代码修改在上一行,这个correctnn是最后分类正确的个数,你就可以通过传递这个参数到某.java
//使用java调用就可以解决这个问题
System.out.println(correct);
svm_predict.info("Accuracy = "+(double)correct/total*100+
"% ("+correct+"/"+total+") (classification)\n");
}
本人第一次写博客,对于代码上的问题比较大的感慨就是如何去debug与读源代码,只有深入了解了 才有可能做出需要的修改
本人原创,转载请注明出处谢谢