如何使用 LIBSVM 的 Android Java 包装器正确设置 LIBSVM.scale() 的参数

Posted

技术标签:

【中文标题】如何使用 LIBSVM 的 Android Java 包装器正确设置 LIBSVM.scale() 的参数【英文标题】:How to properly set the parameters of LIBSVM.scale() with the Android Java wrapper of LIBSVM 【发布时间】:2019-06-04 14:14:15 【问题描述】:

我正在尝试使用 yctung's LIBSVM-wrapper for android 在 Android 上对 262 维数据点进行分类。我设法在具有约 240 个数据点的训练数据集上训练了一个分类器,并在 15 个数据点的测试数据集上成功地对其进行了测试。正如 yctung 建议的那样,只需调用 svm.scale 即可对两个数据集进行缩放:

    svm.scale(appFolderPath + "trainingdata", appFolderPath + "trainingdata_scaled");
    svm.train("-t 0 "/* svm kernel */ + appFolderPath + "trainingdata_scaled " + appFolderPath + "model");
    svm.scale(appFolderPath + "testdata", appFolderPath + "testdata_scaled");
    svm.predict(appFolderPath + "testdata_scaled " + appFolderPath + "model " + appFolderPath + "result");

我得到了很好的结果,所以我继续在运行时生成的单个数据点上尝试该模型。当然,我必须先缩放数据才能对其进行分类(因此“预测”是一个仅包含一个具有 262 个属性的数据点的文件):

        svm.scale(appFolderPath + "predict", appFolderPath + "predict_scaled");
        svm.predict(appFolderPath + "predict_scaled " + appFolderPath + "model " + appFolderPath + "predicted");

但是,svm.scale 不是一个缩放的数据点,而是只返回一个“1”而不是其他任何东西。 我认为这可能是,因为 .scale 尝试相对于彼此比较和缩放数据集中的相应属性,因此如果一组中只有一个数据点,则会出现错误。 它是否正确? 如果是这样,我可以做些什么来将新生成的数据点相对于训练数据集而不是仅仅扩展到其自身?是否可以手动设置缩放参数,这将允许我使用相同的“参考”或设置来缩放每个数据点? 提前谢谢你

【问题讨论】:

我想最好的方法是编写我自己的 scale-funktion。应该不会太难。 【参考方案1】:

如果有人遇到同样的问题: 我的解决方案是在我的训练数据集副本的末尾附加每个新数据点,使用 AndroidLibSvm.scale() 缩放副本并从输出文件中检索现在正确缩放的数据点。工作正常,比任何硬编码的解决方案都要好得多。

【讨论】:

以上是关于如何使用 LIBSVM 的 Android Java 包装器正确设置 LIBSVM.scale() 的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何将 libsvm 模型加载到 Android 中

如何将 MATLAB libsvm 模型复制到 android 应用程序文件夹

java.lang.NoClassDefFoundError:用于在 Android 中使用 JavaML libsvm

是否可以在 Android 中运行 python libsvm?

LibSVM 在大特征向量上失败 (SEGFAULT)

如何将 LIBSVM 模型(使用 LIBSVM 保存)读入 PySpark?