🛠️

liblinear-jsの作成

2024/03/04に公開

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実装と異なる値になるようです。
https://github.com/emscripten-core/emscripten/issues/542
そのため、微妙に値が異なる結果となっています。

Discussion