one-class svm_predict返回0或无法运行的解决方法(成功)

在使用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与读源代码,只有深入了解了 才有可能做出需要的修改

本人原创,转载请注明出处谢谢

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值