2015-11-05 198 views
1

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

我的问题是:我如何使用scikit-learn在我的手机上生成的模型进行预测?到目前为止,我已经考虑扩展api,以便每当手机要进行预测时,就会将数据发送到api以获取一个。但我宁愿能够编写一些Java代码或使用Java库来进行预测。向api发送培训数据不是问题,因为这不是实时完成的 - 只有在收集完数据后才能完成。然而,发送实时预测数据似乎不可行。

由于预测公式和模型参数非常简单,用logistic回归做这件事情要容易得多,我可以放弃svms并使用它,但我也想要svms。

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

+0

我假设你已经看到了这个:http://stackoverflow.com/questions/15625359/support-vector-machine-for-java –

回答

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

或者您可以找到任何用于java的SVM库,并使用您在SVC(C,eps等)中选择的相同参数学习模型。我认为这是非线性内核的最简单解决方案。支持向量机是众所周知的方法,我认为使用相同的参数和数据集进行学习会给任何好的实现带来同样的结果(除了大多数实现和绑定,正如我所说的,依赖于libsvm,在这种情况下,平等是有保证的)。

+0

谢谢,这有助于。 –