在Java中使用libsvm进行字符串分类

时间:2015-08-05 09:18:26

标签: java weka libsvm text-classification

环顾四周,我无法找到一个使用libsvm和Java的好方法,我还有一些未解决的问题:

1)可以只使用libsvm或者我也必须使用weka?如果有的话,有什么区别?

2)使用String类型数据时,如何将训练集作为字符串传递?我正在使用matlab来解决类似的蛋白质分类问题,在那里我只是给了机器没有问题的字符串。有没有办法在Java中做到这一点?

这是我在matlab中所做的一个不完整的例子(它有效):

[~,posTrain] = fastaread('dataset/1.25.1.3_d1ilk__.pos-train.seq');
[~,posTest] = fastaread('dataset/1.25.1.3_d1ilk__.pos-test.seq');
trainKernel = spectrumKernel(trainData,k);
testKernel =  spectrumKernel(testData,k);
trainKf =[(1:length(trainData))', trainKernel];
testKf = [(1:length(testData))', testKernel];
disp('custom');
model = libsvmtrain(trainLabel,trainKf,'-t 4');
[~, accuracy, ~] = libsvmpredict(testLabel,testKf,model)

正如你所看到的,我以fasta格式读取文件并将它们提供给libsvm但是java的libsvm看起来像是想要一个名为Node的由double构成的东西。我所做的是从String中获取byte []然后将它们转换为Double。这是对的吗?

3)如何使用自定义内核?我找到了这行代码

 KernelManager.setCustomKernel(custom_kernel);      

但我的libsvm.jar我找不到。我必须使用哪个lib?

对于多个问题感到抱歉,我希望您能简要介绍一下这里发生了什么。 感谢。

1 个答案:

答案 0 :(得分:2)

请注意,我已将LIBSVM用于MATLAB,但不是用于Java。我只能回答问题1,但希望这仍有帮助:

  1. 绝对可以只使用libsvm,代码位于:https://www.csie.ntu.edu.tw/~cjlin/libsvm/。请注意,jlibsvm是libsvm的一个端口,它似乎更易于使用,并且更适合Java。据我所知,weka只有一个运行libsvm的包装类(它甚至需要libsvm.jar),尽管我主要基于它:https://weka.wikispaces.com/LibSVM