svmjs (英语)
安德烈·卡纳多里 2012年7月 (简体中文)
svmjs是SMO算法的轻量级执行,用于训练二进制 支持矢量机. 由于采用双重表述,它也支持 任意内核。 正确性测试,连同 MATLAB 参考代码 正在测试.
在线图形用户界面演示
此处可见: http://cs.stanford.edu/~karpathy/svmjs/demo/ (中文(简体) )
对应代码在/demo目录内.
使用量
最简单的使用例:
// include the library
<script src="./svmjs/lib/svm.js"></script>
<script>
data = [[0,0], [0,1], [1,0], [1,1]];
labels = [-1, 1, 1, -1];
svm = new svmjs.SVM();
svm.train(data, labels, {C: 1.0}); // C is a parameter to SVM
testlabels = svm.predict(testdata);
</script>
这里, data 财务报告和审定财务报表 testdata 是一个2D,NxD的浮点数组, labels 财务报告和审定财务报表 testlabels
是含有 1 或 -1 的 N 大小阵列。 您也可以查询原始边距 :
margins = svm.margins(testdata);
margin = svm.marginOne(testadata[0]);
库支持任意内核,但目前带有线性内核和rbf内核:
svm.train(data, labels, { kernel: function(v1,v2){ /* return K(v1, v2) */} }); // arbitrary function
svm.train(data, labels, { kernel: 'linear' });
svm.train(data, labels, { kernel: 'rbf', rbfsigma: 0.5 }); // sigma in the gaussian kernel = 0.5
对于训练,你可以通过若干选项。 以下为默认值 :
var options = {};
/* For C, Higher = you trust your data more. Lower = more regularization.
Should be in range of around 1e-2 ... 1e5 at most. */
options.C = 1.0;
options.tol = 1e-4; // do not touch this unless you're pro
options.alphatol = 1e-7; // used for pruning non-support vectors. do not touch unless you're pro
options.maxiter = 10000; // if you have a larger problem, you may need to increase this
options.kernel = svmjs.linearKernel; // discussed above
options.numpasses = 10; // increase this for higher precision of the result. (but slower)
svm.train(data, labels, options);
拇指规则:你几乎总是想先尝试线性SVM,看看它是如何工作的. 你想这样
以大约1e-2到1e5的 C 的不同值进行游戏,因为每个数据集都不同. C=1
通常是一种相当合理的价值。 粗略来说,C是SVM的成本 当它错误的分类你之一
培训实例。 如果你增加, SVM 会非常努力地适应你的所有数据, 这也许是好的
如果你强烈相信自己的数据。 在实践中,你通常不希望它太高。 如果线性内核
效果不好,试试rbf内核. 你必须尝试不同的C值 和同样关键的西格玛值 对于高斯内核.
线性SVM与任何其他内核的比SVM快得多. 如果你想要更快一点 但不太准确, 您想要玩 option.tol( trt 增加一点) 。 你也可以尝试 减少选项.maxiter,特别是选项.numpasses(减少一点). 如果使用非线性 svm,您也可以在测试时通过玩来加速 svm 选项.alphatol(try 增加一点).
如果您使用线性或rbf内核(而不是一些自定义内核),您可以加载并保存 svm :
var svm = new svmjs.SVM();
var json = svm.toJSON();
var svm2 = new svmjs.SVM();
svm2.fromJSON(json);
在节点中使用
要使用此库 节点.js,安装 npm数字 :
npm install svm
像这样使用:
var svm = require("svm");
var SVM = new svm.SVM();
SVM.train(data, labels);
执行详情
SMO算法非常高效,所以你不必担心 无论你的问题有多严重, 都会耗尽空间。 但是,你确实需要 担心运行效率 在实践中, 有很多可以修炼的 用于选择对相( i, j) 优化, 这使用相当天真 办法。 如果你有一个大而复杂的问题,你需要增加 最多一个。 (或别用Javascript!)
许可证
麻省理工学院