在 Java 中使用 libsvm 进行字符串分类
Using libsvm in Java for String classification
环顾四周,我找不到将 libsvm 与 Java 结合使用的好方法,我还有一些悬而未决的问题:
1) 可以只使用 libsvm 还是我还必须使用 weka?如果有的话,有什么区别?
2) 使用字符串类型数据时,如何将训练集作为字符串传递?我正在使用 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 我没有找到。我必须使用哪个库?
抱歉提出了多个问题,我希望您能简要概述一下这里发生的事情。
谢谢
请注意,我已经将 LIBSVM 用于 MATLAB,但未用于 Java。我只能真正回答问题 1,但希望这仍然对您有所帮助:
- 只用libsvm肯定是可以的,代码在这里:https://www.csie.ntu.edu.tw/~cjlin/libsvm/. Note that jlibsvm is a port of libsvm, and it seems to be easier to use and more optimized for Java. As far as I can tell, weka just has a wrapper class that runs libsvm anyways (it even requires the libsvm.jar), though I mainly based it off of this: https://weka.wikispaces.com/LibSVM.
环顾四周,我找不到将 libsvm 与 Java 结合使用的好方法,我还有一些悬而未决的问题:
1) 可以只使用 libsvm 还是我还必须使用 weka?如果有的话,有什么区别?
2) 使用字符串类型数据时,如何将训练集作为字符串传递?我正在使用 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 我没有找到。我必须使用哪个库?
抱歉提出了多个问题,我希望您能简要概述一下这里发生的事情。 谢谢
请注意,我已经将 LIBSVM 用于 MATLAB,但未用于 Java。我只能真正回答问题 1,但希望这仍然对您有所帮助:
- 只用libsvm肯定是可以的,代码在这里:https://www.csie.ntu.edu.tw/~cjlin/libsvm/. Note that jlibsvm is a port of libsvm, and it seems to be easier to use and more optimized for Java. As far as I can tell, weka just has a wrapper class that runs libsvm anyways (it even requires the libsvm.jar), though I mainly based it off of this: https://weka.wikispaces.com/LibSVM.