3

我正在用 Node.js 编写机器学习程序,我想使用 Node.js 中不可用的库,例如 LibLinear 和 SvmPerf。因此,对于训练,我只需创建一个包含训练样本的文件,然后在该文件上执行 SvmPerf 二进制文件。我也可以对分类做同样的事情,但是,由于分类比训练发生的更多,这可能太慢了。

所以我想到了一种不同的方法:由于 SVM(带线性核)中的分类只是模型权重与输入特征值的内积,我可以读取 SvmPerf 模型文件,对其进行解析并保留权重在内存中,然后自己在Node.js中进行分类。

这种方法正确吗?我真的可以通过计算 SvmPerf/LibLinear 创建的模型与输入样本之间的内积来进行分类吗?

4

2 回答 2

3

简短的回答是肯定的。在二进制线性情况下,您所要做的就是检索w超平面的坐标和b参数,计算<w,x>-b新点x并返回结果的符号。在多标签分类的情况下,您将不得不根据使用的库方法(1 vs all 或 1 vs 1)实施某种投票方案。

大多数库不存储w参数,而是存储sv_i具有相应“权重”的支持向量列表slpha_i y_i(通常每个向量一个数字)。要检索w参数,您必须计算w = sum_i alpha_i y_i sv_i. 该b变量有时被称为intercept

于 2013-09-08T07:12:52.803 回答
3

让我在 lejlot 的出色答案中添加几件事:

  • 如果您使用 LIBSVM 或任何其他具有线性内核的 SVM 库,lejlot 所说的完全正确:您需要将 SVM 模型(支持向量和拉格朗日乘数)转换为 w。
  • 如果 OP 感兴趣,他正在使用 LIBLINEAR(不是 SVM 库)。LIBLINEAR 自动生成 w。他只需要从模型中提取它并将其添加到他的 Javascript 程序中
  • 仅当您在 LIBLINEAR 中使用 -b 1 训练分类器时才需要有关 b 的部分。他将在 w 中获得一个额外的维度,并且他需要在分类之前将 1 附加到他的数据中。
于 2013-09-08T17:22:41.753 回答