使用由SvmPerf或LibLinear训练的模型

时间:2013-09-08 07:05:23

标签: machine-learning classification svm

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

所以我想到了一种不同的方法:因为S​​VM中的分类(带有线性内核)只是模型权重与输入特征值的内积,我只需读取SvmPerf模型文件,解析它和将权重保存在内存中,然后在Node.js中自己进行分类。

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

让我为lejlot的优秀答案添加一些内容:

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