在Android中使用训练有素的Scikit-learn svm分类器

时间:2015-11-05 01:20:38

标签: android scikit-learn

我正在开发一款Android应用,它使用手机中的传感器数据对活动进行分类。我也非常喜欢scikit-learn到任何Java机器学习库。因此,我使用Django创建了一个非常小的REST api,scikit学习使用支持向量机训练传感器数据并返回模型信息。

我的问题是:如何在手机上使用模型scikit-learn产生预测?到目前为止,我已经考虑过延长api,以便每当手机想要进行预测时,它会将数据发送到api以获得一个。但我更愿意编写一些Java代码或使用Java库来进行预测。将训练数据发送到api不是一个问题,因为这不是实时完成的 - 只有在数据已被收集时才会完成。但是,发送实时预测数据似乎并不可行。

使用逻辑回归进行此操作非常容易,因为预测公式和模型参数非常简单;我可以放弃svms并使用它,但我也希望有svms可用。

任何人都知道有人这样做过吗?有没有一个可靠的相对较短的时间,没有一个博士的数字计算或机器学习方式来做到这一点?详细步骤是不必要的,只是概述了如何使用scikit-learn产生的svm组件。

1 个答案:

答案 0 :(得分:4)

大多数使用SVM的软件包(scikit-learn)都依赖于libsvm实现。但是你不需要来自libsvm的99%的代码而且你不必是博士,因为你在学习scikit-learn之后已经拥有了所有参数。所有你需要的 - 在java中任何简单的线性代数库(仅用于向量*向量运算)来实现决策函数。

如果你在SVC中使用线性内核 - 它相对容易,因为scikit-learn自动将所有那些复杂的双系数和支持向量转换为简单的超平面系数,因此决策函数变得等效于逻辑回归,所有这些你需要这里 - 点积 - 看这里Exporting SVM classifiers from sklearn to Java codebase

对于非线性内核 - 再次只需要决策函数,但现在你必须了解什么是支持向量,什么是双系数,什么是内核,你必须在java中实现你的非线性内核。我认为在不理解SVC优化过程如何工作的情况下实现非线性SVC的决策功能并不容易,我会给你一些链接:

  1. Layout of SVC attributes
  2. Decision Function
  3. Where all these dual coefficients and support vectors come from
  4. 或者您可以找到任何用于Java的SVM库,并使用您在SVC(C,eps等)中选择的相同参数学习模型。我认为这是非线性内核最简单的解决方案。 SVM是众所周知的方法,我认为使用相同的参数和数据集学习将在任何良好的实现上给出相同的结果(除了大多数实现和绑定,如我所说,依赖于libsvm,在这种情况下,保证相等)。