Android上使用LibSVM
LibSVM的Java版本源代码包含在其源代码包中。我们只需要libsvm.jar包和
svm_train.javasvm_predict.java
并主要参考主文件夹下的
README
文件。将jar包添加到工程的libs中,将两个java文件也复制到你的MainActivity.java所在的package中。Android Studio中要点击左上角的Project视图才会看见libs文件夹,如下图:
如何调用
研究了README文件和svm_train及svm_predict的main函数的参数argv[]的使用后,我才知道,尽管用java实现,调用方式仍严格按照命令行调用方法。即,分别调用svm_train.java和svm_train.java的main函数,参数为一个String数组(类似命令行调用中的空格分隔),每个String或者表示一个读入或写出文件,或者表示一个选项。
怎样使一个String代表一个文件呢?
因为我们知道在java中,文件应该是File类型的。我在svm_train.java中的read_problem()函数里找到如下代码(我为所有的BufferdReader前都加了一行new File,可能是多此一举了):
input_file = new File(input_file_name); //I changed a littleBufferedReader fp = new BufferedReader(new FileReader(input_file)); //I changed a little
于是我明白新建File及读取文件的操作都已集成在两个java文件里了,我只要将文件名(包括文件路径)传入即可。加入我将这些文件都放在手机sd卡上Log文件夹下的Mei文件夹内(输出文件也要提前新建好文件),那么我这样获得文件路径:
String sd_card = Environment.getExternalStorageDirectory().toString(); String path = sd_card + "/Log/Mei"; String train_path = path + "/train.txt"; String test_path = path + "/test.txt"; String output_path = path + "/result.txt"; String model_name = path + "/my_model.txt";
注意到model也就是一个txt文件!
怎样确定各String的涵义及顺序呢?
在README中明确规定了svm_train的调用方法:
Usage: svm-train [options] training_set_file [model_file]
和svm_predict的调用方法:
Usage: svm-predict [options] test_file model_file output_file
于是我们就知道该怎么给String[]赋值了!svm_train的两个String分别是输入的训练数据和输出的model文件,svm_predict的三个String分别是输入的测试数据、输入的model文件和输出的结果文件。
最后这样调用
String[] trainArgs = {train_path, model_name};String[] testArgs = {test_path, model_name, output_path};svm_train train = new svm_train();svm_predict predict = new svm_predict();train.main(trainArgs);predict.main(testArgs);
关于data格式要求的简化
在README中,LibSVM对训练数据和测试数据都有格式规定:
label表示这个样本的类别(比如两类的情况,通常label为+1或-1);index是一个同一个feature的标号,之所以要在特征的value前加index是因为不是所有的样本都具备所有的feature的值(比如A有长、宽、高三个特征的值,但B只有高、宽两个特征的值);value就是值咯。
但其实index和value之间的冒号不是必须的,因为我在svm_train和svm_predict代码里发现了这一行:
StringTokenizer st = new StringTokenizer(line," \t\n\r\f:");
也就是说,在每一行样本中,各值间的间隔符可以只用空格、”:”、Tab、换行符中的一种!所以,我没有写python来把我的数据改成它要求的格式,因为在MatLab里,一行
dlmwrite(transformed_file, matrix, ':');
就搞定了(matrix为要写入的矩阵,transfomed_file为要写入的文件名,’:’为矩阵值间的分隔符)。
源码在这里。
更多相关文章
- Android(安卓)tablet Fragment 中 TableLayout的同一行相邻的两
- Android(安卓)SDK目录结构和工具介绍
- Android学习笔记(三十):弹出信息-Toast和告警
- delphi xe5 android 开发实现手机打电话和发短信
- Android处理非res资源的例子
- [置顶] android 实现发送彩信方法 (MMS),非调用系统彩信界面
- Android下载repo文件报错
- Android系统文件夹结构
- Android(安卓)系统服务入门