我在Node.js中编写一个机器学习程序,想使用LibLinear和SvmPerf这样的库,但这些库在Node.js中不可用。因此,在训练时,我只是创建一个包含训练样本的文件,并在该文件上执行SvmPerf二进制文件。对于分类,我也可以这样做,但由于分类比训练频繁得多,这样做可能会太慢。
所以我想到了另一种方法:由于SVM中的分类(使用线性核)只是模型权重与输入特征值的内积,我可以读取SvmPerf的模型文件,解析它并将权重保存在内存中,然后在Node.js中自己进行分类。
这种方法正确吗?我确实可以通过计算SvmPerf/LibLinear创建的模型与输入样本之间的内积来进行分类吗?
回答:
简短的回答是是的。在二元线性情况下,你只需获取w
超平面的坐标和b
参数,计算新点x
的<w,x>-b
,并返回结果的符号。对于多标签分类,你需要根据所使用的库方法(1对所有或1对1)实现某种投票方案。
大多数库不存储w
参数,而是存储支持向量sv_i
的列表及其对应的“权重”slpha_i y_i
(通常每个向量一个数字)。要获取w
参数,你必须计算w = sum_i alpha_i y_i sv_i
。而b
变量有时被称为intercept
。