加载模型上的 Java libSVM NullPointerException

Posted

技术标签:

【中文标题】加载模型上的 Java libSVM NullPointerException【英文标题】:Java libSVM NullPointerException on loaded model 【发布时间】:2017-04-20 04:39:53 【问题描述】:

我一直在将 libSVM 用于 Java 项目,在对相当大的数据集进行训练后,使用 api 中的函数将模型保存到文件中。后来,我尝试加载文件以进行一些预测,但每次调用 svm.svm_predict 函数时都会收到 NullPointerException。我可以验证该代码是否适用于较小的模型文件,但对于这个较大的集合来说不断失败。以下是完整的错误信息:

Exception in thread "main" java.lang.NullPointerException
    at libsvm.Kernel.dot(svm.java:213)
    at libsvm.Kernel.k_function(svm.java:232)
    at libsvm.svm.svm_predict_values(svm.java:2349)
    at libsvm.svm.svm_predict(svm.java:2406)
    at com.svm.SVM.predict(...)
    at com.svm.SVM.main(...)

奇怪的是,我可以打印出概率并访问 SVM 的其他元素——模型不为空;但是,每当我尝试预测给定向量的结果时,它都会崩溃。有什么想法吗?

【问题讨论】:

【参考方案1】:

测试数据必须有向量中每个部分的数据。 IE。 - 如果最大的训练样本对向量有 105 个部分,那么每个测试向量必须有 105 个部分。即使你只有给定测试向量的 15 个部分,你也需要用其他 90 个元素填充它。如果您没有分配适当大小的数组,libSVM 会尝试访问给定的测试数据数组之外的元素以进行预测。

【讨论】:

以上是关于加载模型上的 Java libSVM NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

如何将 libsvm 模型加载到 Android 中

使用java libsvm进行文本分类——模型、参数选择

Libsvm java工程实践

使用 LibSVM 进行分类

在 java 代码中使用 libsvm 在移动设备中执行预测

LibSVM 预测不工作