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为要写入的文件名,’:’为矩阵值间的分隔符)。

源码在这里。


更多相关文章

  1. Android(安卓)tablet Fragment 中 TableLayout的同一行相邻的两
  2. Android(安卓)SDK目录结构和工具介绍
  3. Android学习笔记(三十):弹出信息-Toast和告警
  4. delphi xe5 android 开发实现手机打电话和发短信
  5. Android处理非res资源的例子
  6. [置顶] android 实现发送彩信方法 (MMS),非调用系统彩信界面
  7. Android下载repo文件报错
  8. Android系统文件夹结构
  9. Android(安卓)系统服务入门

随机推荐

  1. android文件选择、读取、浏览器的实现(音
  2. Super Jumper:一个2DOpenGL ES游戏
  3. android box2d运行小例子,配置eclipse【转
  4. Framework StatusBar添加(wifi,bluetooth,
  5. android 蓝牙小总结
  6. Android(安卓)ViewPager 如何判断当前页
  7. Android与iPhone的对比(水木上看到的,不清
  8. Android(安卓)8.0 以上获取设备序列号, An
  9. Android应用开发笔记(7):构建自己的Androi
  10. android eclipse 混淆jar代码