我正在开发一款Android应用程序,该应用程序使用手机中的传感器数据对活动进行分类。与任何Java机器学习库相比,我也更喜欢scikit-learn。因此,我使用Django和scikit创建了一个非常简单的RESTapi,学习使用支持向量机训练传感器数据并返回模型信息。
我的问题是:我如何使用手机上的scikit learn生成的模型进行预测?到目前为止,我已经考虑扩展api,以便每当手机想要进行预测时,它都会将数据发送到api以获得预测。但我更希望能够编写一些Java代码或使用Java库来进行预测。将用于训练的数据发送到api不是问题,因为这不是实时完成的——只有在数据已经收集时才能完成。然而,发送数据进行实时预测似乎并不可行。
使用逻辑回归做这件事要容易得多,因为预测公式和模型参数非常简单;我可以放弃svms,转而使用它,但我也希望svms可用。
有人知道以前有人这样做吗?有没有一种在相对较短的时间内由一个没有博士学位的人在数字计算或机器学习方面做到这一点的可行方法?详细的步骤是不必要的,只是概述如何使用scikit学习产生的svm的组件。
大多数带有SVM的包(scikit也学习)都依赖于libsvm实现。但你不需要来自libsvm的99%的代码,也不必是博士,因为在scikit-learn中学习后,你已经掌握了所有参数。您所需要的一切-任何简单的线性代数库(仅用于向量*向量运算)在java中实现决策函数。
如果你在SVC中使用线性核,这相对容易,因为scikit learn会自动将所有复杂的对偶系数和支持向量转换为简单的超平面系数,因此决策函数等效于逻辑回归,这里需要的就是点积-看这里将SVM分类器从sklearn导出到Java代码库
在非线性内核的情况下,同样只需要决策函数,但现在你必须了解什么是支持向量,什么是对偶系数,什么是内核,你必须用java实现你的非线性内核。我认为,在不了解SVC优化过程如何工作的情况下,实现非线性SVC的决策函数不是一件容易的事,我会给你一些链接:
- SVC属性布局
- 决策函数
- 所有这些对偶系数和支持向量来自哪里
或者,您可以找到任何适用于java的SVM库,并学习与您在SVC中选择的参数相同的模型(C、eps等)。我认为这是非线性核的最简单的解决方案。SVM是一种众所周知的方法,我认为在任何好的实现中,使用相同的参数和数据集进行学习都会得到相同的结果(此外,正如我所说,大多数实现和绑定都依赖于libsvm,在这种情况下,平等是有保证的)。