🛠️
liblinear-jsの作成
liblinear
Linear SVM専用である代わりに、すごく速いliblinearがあります。
それをasm、wasm化してjavascriptで動くように実装しました。
libsvm-jsの実装を元にliblinearに変更しました。
heart_scaleの比較
liblinear
$ ./traion heart_scale
......*
optimization finished, #iter = 69
Objective value = -121.097755
nSV = 195
$ cat heart_scale.model
solver_type L2R_L2LOSS_SVC_DUAL
nr_class 2
label 1 -1
nr_feature 13
bias -1
w
0.09435047425578702
0.22854156479383081
0.42658392478264157
0.26972200139456326
-0.0036754158150273581
-0.16198227574629837
0.1234298617257451
-0.26922708968936909
0.13107955004967242
0.052246026590740548
0.16808995917990047
0.44448039579646403
0.2557915826296378
$ ./predict heart_scale heart_scale.model output
Accuracy = 84.4444% (228/270)
liblinear-js
$ node examples/heart_scale.js
asm
......**
optimization finished, #iter = 69
Objective value = -121.100609
nSV = 194
accuracy 0.8407407407407408
labels [ 1, -1 ]
save model solver_type L2R_L2LOSS_SVC_DUAL
nr_class 2
label 1 -1
nr_feature 13
bias -1
w
0.10061524012539598
0.23361071683590745
0.42847935606199655
0.27072748774592936
-0.0073420309137447728
-0.16710149713791683
0.12140330404612576
-0.28038144893940592
0.12003568462060064
0.043172079493657416
0.16818634853535236
0.44618781660710033
0.26444780814914576
wasm
......**
optimization finished, #iter = 69
Objective value = -121.100609
nSV = 194
accuracy 0.8407407407407408
labels [ 1, -1 ]
save model solver_type L2R_L2LOSS_SVC_DUAL
nr_class 2
label 1 -1
nr_feature 13
bias -1
w
0.10061524012539598
0.23361071683590745
0.42847935606199655
0.27072748774592936
-0.0073420309137447728
-0.16710149713791683
0.12140330404612576
-0.28038144893940592
0.12003568462060064
0.043172079493657416
0.16818634853535236
0.44618781660710033
0.26444780814914576
liblinearとliblinear-jsの違い
liblinearとliblinear-jsで微妙に数値が違います。
その結果、Accuracyも概ね同じですが、微妙に異なります。
Accuracy = 84.4444%
Accuracy = 84.0741%
liblinearのソースをemscriptenでwasm(asm)化しているだけなので、一致するはずと思われますが。
emscriptenでは、rand()がC実装と異なる値になるようです。
そのため、微妙に値が異なる結果となっています。
Discussion