liblinear-ruby 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +6 -3
- data/ext/liblinear_wrap.cxx +99 -0
- data/ext/linear.cpp +61 -11
- data/ext/linear.h +3 -0
- data/lib/liblinear/model.rb +37 -6
- data/lib/liblinear/version.rb +1 -1
- data/{liblinear-1.94 → liblinear-1.95}/COPYRIGHT +1 -1
- data/{liblinear-1.94 → liblinear-1.95}/Makefile +1 -1
- data/{liblinear-1.94 → liblinear-1.95}/Makefile.win +1 -1
- data/{liblinear-1.94 → liblinear-1.95}/README +32 -1
- data/{liblinear-1.94 → liblinear-1.95}/blas/Makefile +0 -0
- data/{liblinear-1.94 → liblinear-1.95}/blas/blas.h +0 -0
- data/{liblinear-1.94 → liblinear-1.95}/blas/blasp.h +8 -0
- data/{liblinear-1.94 → liblinear-1.95}/blas/daxpy.c +8 -0
- data/{liblinear-1.94 → liblinear-1.95}/blas/ddot.c +8 -0
- data/{liblinear-1.94 → liblinear-1.95}/blas/dnrm2.c +8 -0
- data/{liblinear-1.94 → liblinear-1.95}/blas/dscal.c +8 -0
- data/{liblinear-1.94 → liblinear-1.95}/heart_scale +0 -0
- data/{liblinear-1.94 → liblinear-1.95}/linear.cpp +61 -11
- data/{liblinear-1.94 → liblinear-1.95}/linear.def +3 -0
- data/{liblinear-1.94 → liblinear-1.95}/linear.h +3 -0
- data/{liblinear-1.94 → liblinear-1.95}/matlab/Makefile +2 -11
- data/{liblinear-1.94 → liblinear-1.95}/matlab/README +0 -0
- data/{liblinear-1.94 → liblinear-1.95}/matlab/libsvmread.c +3 -4
- data/{liblinear-1.94 → liblinear-1.95}/matlab/libsvmwrite.c +6 -7
- data/{liblinear-1.94 → liblinear-1.95}/matlab/linear_model_matlab.c +1 -1
- data/{liblinear-1.94 → liblinear-1.95}/matlab/linear_model_matlab.h +0 -0
- data/{liblinear-1.94 → liblinear-1.95}/matlab/make.m +21 -21
- data/{liblinear-1.94 → liblinear-1.95}/matlab/predict.c +4 -6
- data/{liblinear-1.94 → liblinear-1.95}/matlab/train.c +27 -17
- data/{liblinear-1.94 → liblinear-1.95}/predict.c +1 -3
- data/{liblinear-1.94 → liblinear-1.95}/python/Makefile +0 -0
- data/{liblinear-1.94 → liblinear-1.95}/python/README +30 -0
- data/{liblinear-1.94 → liblinear-1.95}/python/liblinear.py +35 -8
- data/{liblinear-1.94 → liblinear-1.95}/python/liblinearutil.py +7 -1
- data/{liblinear-1.94 → liblinear-1.95}/train.c +1 -1
- data/{liblinear-1.94 → liblinear-1.95}/tron.cpp +0 -0
- data/{liblinear-1.94 → liblinear-1.95}/tron.h +0 -0
- data/{liblinear-1.94 → liblinear-1.95}/windows/liblinear.dll +0 -0
- data/liblinear-1.95/windows/libsvmread.mexw64 +0 -0
- data/liblinear-1.95/windows/libsvmwrite.mexw64 +0 -0
- data/{liblinear-1.94 → liblinear-1.95}/windows/predict.exe +0 -0
- data/liblinear-1.95/windows/predict.mexw64 +0 -0
- data/{liblinear-1.94 → liblinear-1.95}/windows/train.exe +0 -0
- data/liblinear-1.95/windows/train.mexw64 +0 -0
- data/spec/liblinear/model_spec.rb +50 -11
- metadata +43 -42
- data/liblinear-1.94/windows/libsvmread.mexw64 +0 -0
- data/liblinear-1.94/windows/libsvmwrite.mexw64 +0 -0
- data/liblinear-1.94/windows/predict.mexw64 +0 -0
- data/liblinear-1.94/windows/train.mexw64 +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac700b40f9f8bc42fbb319f6d510b150740556e7
|
4
|
+
data.tar.gz: 1027bf69f4ab2a882c12b0d569ce952a2729c350
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ea3e62ea0b3977d0a49f5ed700f7e40079c99b144eda439a384cb04de644d21355db4e032f150430c3abc9df4cfea1fdd3828409f119a636dd01fbcc63b254e
|
7
|
+
data.tar.gz: 610cf9eab7d391d5c4ee1767e28accc957c158402a15d5bd637c55eaa1bf960218f5d52581752499ffbb77dab3bd5e65a0e8d14a12ee9772047d14ac76077269
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Liblinear-Ruby
|
2
2
|
[](http://badge.fury.io/rb/liblinear-ruby)
|
3
3
|
|
4
|
-
Liblinear-Ruby is Ruby interface to LIBLINEAR using SWIG.
|
5
|
-
Now, this interface is supporting LIBLINEAR 1.
|
4
|
+
Liblinear-Ruby is Ruby interface to LIBLINEAR using SWIG.
|
5
|
+
Now, this interface is supporting LIBLINEAR 1.95.
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -39,6 +39,10 @@ model = Liblinear::Model.new(prob, param)
|
|
39
39
|
|
40
40
|
# Predicting phase
|
41
41
|
puts model.predict({1=>1, 2=>1, 3=>1, 4=>1, 5=>1}) # => -1.0
|
42
|
+
|
43
|
+
# Analyzing phase
|
44
|
+
puts model.coefficient
|
45
|
+
puts model.bias
|
42
46
|
```
|
43
47
|
## Usage
|
44
48
|
|
@@ -147,7 +151,6 @@ model = Liblinear::Model.new(prob, param)
|
|
147
151
|
```
|
148
152
|
If you have already had a model file, you can load it as:
|
149
153
|
```ruby
|
150
|
-
prob = Liblinear::Problem.new(labels, examples, bias)
|
151
154
|
model = Liblinear::Model.new(model_file)
|
152
155
|
```
|
153
156
|
In this phase, you can save model as:
|
data/ext/liblinear_wrap.cxx
CHANGED
@@ -3681,6 +3681,78 @@ fail:
|
|
3681
3681
|
}
|
3682
3682
|
|
3683
3683
|
|
3684
|
+
SWIGINTERN VALUE
|
3685
|
+
_wrap_get_decfun_coef(int argc, VALUE *argv, VALUE self) {
|
3686
|
+
model *arg1 = (model *) 0 ;
|
3687
|
+
int arg2 ;
|
3688
|
+
int arg3 ;
|
3689
|
+
void *argp1 = 0 ;
|
3690
|
+
int res1 = 0 ;
|
3691
|
+
int val2 ;
|
3692
|
+
int ecode2 = 0 ;
|
3693
|
+
int val3 ;
|
3694
|
+
int ecode3 = 0 ;
|
3695
|
+
double result;
|
3696
|
+
VALUE vresult = Qnil;
|
3697
|
+
|
3698
|
+
if ((argc < 3) || (argc > 3)) {
|
3699
|
+
rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
|
3700
|
+
}
|
3701
|
+
res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_model, 0 | 0 );
|
3702
|
+
if (!SWIG_IsOK(res1)) {
|
3703
|
+
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "model const *","get_decfun_coef", 1, argv[0] ));
|
3704
|
+
}
|
3705
|
+
arg1 = reinterpret_cast< model * >(argp1);
|
3706
|
+
ecode2 = SWIG_AsVal_int(argv[1], &val2);
|
3707
|
+
if (!SWIG_IsOK(ecode2)) {
|
3708
|
+
SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","get_decfun_coef", 2, argv[1] ));
|
3709
|
+
}
|
3710
|
+
arg2 = static_cast< int >(val2);
|
3711
|
+
ecode3 = SWIG_AsVal_int(argv[2], &val3);
|
3712
|
+
if (!SWIG_IsOK(ecode3)) {
|
3713
|
+
SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "int","get_decfun_coef", 3, argv[2] ));
|
3714
|
+
}
|
3715
|
+
arg3 = static_cast< int >(val3);
|
3716
|
+
result = (double)get_decfun_coef((model const *)arg1,arg2,arg3);
|
3717
|
+
vresult = SWIG_From_double(static_cast< double >(result));
|
3718
|
+
return vresult;
|
3719
|
+
fail:
|
3720
|
+
return Qnil;
|
3721
|
+
}
|
3722
|
+
|
3723
|
+
|
3724
|
+
SWIGINTERN VALUE
|
3725
|
+
_wrap_get_decfun_bias(int argc, VALUE *argv, VALUE self) {
|
3726
|
+
model *arg1 = (model *) 0 ;
|
3727
|
+
int arg2 ;
|
3728
|
+
void *argp1 = 0 ;
|
3729
|
+
int res1 = 0 ;
|
3730
|
+
int val2 ;
|
3731
|
+
int ecode2 = 0 ;
|
3732
|
+
double result;
|
3733
|
+
VALUE vresult = Qnil;
|
3734
|
+
|
3735
|
+
if ((argc < 2) || (argc > 2)) {
|
3736
|
+
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
|
3737
|
+
}
|
3738
|
+
res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_model, 0 | 0 );
|
3739
|
+
if (!SWIG_IsOK(res1)) {
|
3740
|
+
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "model const *","get_decfun_bias", 1, argv[0] ));
|
3741
|
+
}
|
3742
|
+
arg1 = reinterpret_cast< model * >(argp1);
|
3743
|
+
ecode2 = SWIG_AsVal_int(argv[1], &val2);
|
3744
|
+
if (!SWIG_IsOK(ecode2)) {
|
3745
|
+
SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","get_decfun_bias", 2, argv[1] ));
|
3746
|
+
}
|
3747
|
+
arg2 = static_cast< int >(val2);
|
3748
|
+
result = (double)get_decfun_bias((model const *)arg1,arg2);
|
3749
|
+
vresult = SWIG_From_double(static_cast< double >(result));
|
3750
|
+
return vresult;
|
3751
|
+
fail:
|
3752
|
+
return Qnil;
|
3753
|
+
}
|
3754
|
+
|
3755
|
+
|
3684
3756
|
SWIGINTERN VALUE
|
3685
3757
|
_wrap_free_model_content(int argc, VALUE *argv, VALUE self) {
|
3686
3758
|
model *arg1 = (model *) 0 ;
|
@@ -3800,6 +3872,30 @@ fail:
|
|
3800
3872
|
}
|
3801
3873
|
|
3802
3874
|
|
3875
|
+
SWIGINTERN VALUE
|
3876
|
+
_wrap_check_regression_model(int argc, VALUE *argv, VALUE self) {
|
3877
|
+
model *arg1 = (model *) 0 ;
|
3878
|
+
void *argp1 = 0 ;
|
3879
|
+
int res1 = 0 ;
|
3880
|
+
int result;
|
3881
|
+
VALUE vresult = Qnil;
|
3882
|
+
|
3883
|
+
if ((argc < 1) || (argc > 1)) {
|
3884
|
+
rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
|
3885
|
+
}
|
3886
|
+
res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_model, 0 | 0 );
|
3887
|
+
if (!SWIG_IsOK(res1)) {
|
3888
|
+
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "model const *","check_regression_model", 1, argv[0] ));
|
3889
|
+
}
|
3890
|
+
arg1 = reinterpret_cast< model * >(argp1);
|
3891
|
+
result = (int)check_regression_model((model const *)arg1);
|
3892
|
+
vresult = SWIG_From_int(static_cast< int >(result));
|
3893
|
+
return vresult;
|
3894
|
+
fail:
|
3895
|
+
return Qnil;
|
3896
|
+
}
|
3897
|
+
|
3898
|
+
|
3803
3899
|
SWIGINTERN VALUE
|
3804
3900
|
_wrap_set_print_string_function(int argc, VALUE *argv, VALUE self) {
|
3805
3901
|
void (*arg1)(char const *) = (void (*)(char const *)) 0 ;
|
@@ -4622,11 +4718,14 @@ SWIGEXPORT void Init_liblinearswig(void) {
|
|
4622
4718
|
rb_define_module_function(mLiblinearswig, "get_nr_feature", VALUEFUNC(_wrap_get_nr_feature), -1);
|
4623
4719
|
rb_define_module_function(mLiblinearswig, "get_nr_class", VALUEFUNC(_wrap_get_nr_class), -1);
|
4624
4720
|
rb_define_module_function(mLiblinearswig, "get_labels", VALUEFUNC(_wrap_get_labels), -1);
|
4721
|
+
rb_define_module_function(mLiblinearswig, "get_decfun_coef", VALUEFUNC(_wrap_get_decfun_coef), -1);
|
4722
|
+
rb_define_module_function(mLiblinearswig, "get_decfun_bias", VALUEFUNC(_wrap_get_decfun_bias), -1);
|
4625
4723
|
rb_define_module_function(mLiblinearswig, "free_model_content", VALUEFUNC(_wrap_free_model_content), -1);
|
4626
4724
|
rb_define_module_function(mLiblinearswig, "free_and_destroy_model", VALUEFUNC(_wrap_free_and_destroy_model), -1);
|
4627
4725
|
rb_define_module_function(mLiblinearswig, "destroy_param", VALUEFUNC(_wrap_destroy_param), -1);
|
4628
4726
|
rb_define_module_function(mLiblinearswig, "check_parameter", VALUEFUNC(_wrap_check_parameter), -1);
|
4629
4727
|
rb_define_module_function(mLiblinearswig, "check_probability_model", VALUEFUNC(_wrap_check_probability_model), -1);
|
4728
|
+
rb_define_module_function(mLiblinearswig, "check_regression_model", VALUEFUNC(_wrap_check_regression_model), -1);
|
4630
4729
|
rb_define_module_function(mLiblinearswig, "set_print_string_function", VALUEFUNC(_wrap_set_print_string_function), -1);
|
4631
4730
|
rb_define_module_function(mLiblinearswig, "new_int", VALUEFUNC(_wrap_new_int), -1);
|
4632
4731
|
rb_define_module_function(mLiblinearswig, "delete_int", VALUEFUNC(_wrap_delete_int), -1);
|
data/ext/linear.cpp
CHANGED
@@ -1010,7 +1010,7 @@ static void solve_l2r_l1l2_svr(
|
|
1010
1010
|
double d, G, H;
|
1011
1011
|
double Gmax_old = INF;
|
1012
1012
|
double Gmax_new, Gnorm1_new;
|
1013
|
-
double Gnorm1_init;
|
1013
|
+
double Gnorm1_init = -1.0; // Gnorm1_init is initialized at the first iteration
|
1014
1014
|
double *beta = new double[l];
|
1015
1015
|
double *QD = new double[l];
|
1016
1016
|
double *y = prob->y;
|
@@ -1409,7 +1409,7 @@ static void solve_l1r_l2_svc(
|
|
1409
1409
|
double d, G_loss, G, H;
|
1410
1410
|
double Gmax_old = INF;
|
1411
1411
|
double Gmax_new, Gnorm1_new;
|
1412
|
-
double Gnorm1_init;
|
1412
|
+
double Gnorm1_init = -1.0; // Gnorm1_init is initialized at the first iteration
|
1413
1413
|
double d_old, d_diff;
|
1414
1414
|
double loss_old, loss_new;
|
1415
1415
|
double appxcond, cond;
|
@@ -1699,7 +1699,7 @@ static void solve_l1r_lr(
|
|
1699
1699
|
double sigma = 0.01;
|
1700
1700
|
double w_norm, w_norm_new;
|
1701
1701
|
double z, G, H;
|
1702
|
-
double Gnorm1_init;
|
1702
|
+
double Gnorm1_init = -1.0; // Gnorm1_init is initialized at the first iteration
|
1703
1703
|
double Gmax_old = INF;
|
1704
1704
|
double Gmax_new, Gnorm1_new;
|
1705
1705
|
double QP_Gmax_old = INF;
|
@@ -2051,8 +2051,8 @@ static void transpose(const problem *prob, feature_node **x_space_ret, problem *
|
|
2051
2051
|
int i;
|
2052
2052
|
int l = prob->l;
|
2053
2053
|
int n = prob->n;
|
2054
|
-
|
2055
|
-
|
2054
|
+
size_t nnz = 0;
|
2055
|
+
size_t *col_ptr = new size_t [n+1];
|
2056
2056
|
feature_node *x_space;
|
2057
2057
|
prob_col->l = l;
|
2058
2058
|
prob_col->n = n;
|
@@ -2305,9 +2305,7 @@ model* train(const problem *prob, const parameter *param)
|
|
2305
2305
|
model_->param = *param;
|
2306
2306
|
model_->bias = prob->bias;
|
2307
2307
|
|
2308
|
-
if(
|
2309
|
-
param->solver_type == L2R_L1LOSS_SVR_DUAL ||
|
2310
|
-
param->solver_type == L2R_L2LOSS_SVR_DUAL)
|
2308
|
+
if(check_regression_model(model_))
|
2311
2309
|
{
|
2312
2310
|
model_->w = Malloc(double, w_size);
|
2313
2311
|
model_->nr_class = 2;
|
@@ -2512,9 +2510,7 @@ double predict_values(const struct model *model_, const struct feature_node *x,
|
|
2512
2510
|
|
2513
2511
|
if(nr_class==2)
|
2514
2512
|
{
|
2515
|
-
if(model_
|
2516
|
-
model_->param.solver_type == L2R_L1LOSS_SVR_DUAL ||
|
2517
|
-
model_->param.solver_type == L2R_L2LOSS_SVR_DUAL)
|
2513
|
+
if(check_regression_model(model_))
|
2518
2514
|
return dec_values[0];
|
2519
2515
|
else
|
2520
2516
|
return (dec_values[0]>0)?model_->label[0]:model_->label[1];
|
@@ -2764,6 +2760,53 @@ void get_labels(const model *model_, int* label)
|
|
2764
2760
|
label[i] = model_->label[i];
|
2765
2761
|
}
|
2766
2762
|
|
2763
|
+
// use inline here for better performance (around 20% faster than the non-inline one)
|
2764
|
+
static inline double get_w_value(const struct model *model_, int idx, int label_idx)
|
2765
|
+
{
|
2766
|
+
int nr_class = model_->nr_class;
|
2767
|
+
int solver_type = model_->param.solver_type;
|
2768
|
+
const double *w = model_->w;
|
2769
|
+
|
2770
|
+
if(idx < 0 || idx > model_->nr_feature)
|
2771
|
+
return 0;
|
2772
|
+
if(check_regression_model(model_))
|
2773
|
+
return w[idx];
|
2774
|
+
else
|
2775
|
+
{
|
2776
|
+
if(label_idx < 0 || label_idx >= nr_class)
|
2777
|
+
return 0;
|
2778
|
+
if(nr_class == 2 && solver_type != MCSVM_CS)
|
2779
|
+
{
|
2780
|
+
if(label_idx == 0)
|
2781
|
+
return w[idx];
|
2782
|
+
else
|
2783
|
+
return -w[idx];
|
2784
|
+
}
|
2785
|
+
else
|
2786
|
+
return w[idx*nr_class+label_idx];
|
2787
|
+
}
|
2788
|
+
}
|
2789
|
+
|
2790
|
+
// feat_idx: starting from 1 to nr_feature
|
2791
|
+
// label_idx: starting from 0 to nr_class-1 for classification models;
|
2792
|
+
// for regression models, label_idx is ignored.
|
2793
|
+
double get_decfun_coef(const struct model *model_, int feat_idx, int label_idx)
|
2794
|
+
{
|
2795
|
+
if(feat_idx > model_->nr_feature)
|
2796
|
+
return 0;
|
2797
|
+
return get_w_value(model_, feat_idx-1, label_idx);
|
2798
|
+
}
|
2799
|
+
|
2800
|
+
double get_decfun_bias(const struct model *model_, int label_idx)
|
2801
|
+
{
|
2802
|
+
int bias_idx = model_->nr_feature;
|
2803
|
+
double bias = model_->bias;
|
2804
|
+
if(bias <= 0)
|
2805
|
+
return 0;
|
2806
|
+
else
|
2807
|
+
return bias*get_w_value(model_, bias_idx, label_idx);
|
2808
|
+
}
|
2809
|
+
|
2767
2810
|
void free_model_content(struct model *model_ptr)
|
2768
2811
|
{
|
2769
2812
|
if(model_ptr->w != NULL)
|
@@ -2824,6 +2867,13 @@ int check_probability_model(const struct model *model_)
|
|
2824
2867
|
model_->param.solver_type==L1R_LR);
|
2825
2868
|
}
|
2826
2869
|
|
2870
|
+
int check_regression_model(const struct model *model_)
|
2871
|
+
{
|
2872
|
+
return (model_->param.solver_type==L2R_L2LOSS_SVR ||
|
2873
|
+
model_->param.solver_type==L2R_L1LOSS_SVR_DUAL ||
|
2874
|
+
model_->param.solver_type==L2R_L2LOSS_SVR_DUAL);
|
2875
|
+
}
|
2876
|
+
|
2827
2877
|
void set_print_string_function(void (*print_func)(const char*))
|
2828
2878
|
{
|
2829
2879
|
if (print_func == NULL)
|
data/ext/linear.h
CHANGED
@@ -57,6 +57,8 @@ struct model *load_model(const char *model_file_name);
|
|
57
57
|
int get_nr_feature(const struct model *model_);
|
58
58
|
int get_nr_class(const struct model *model_);
|
59
59
|
void get_labels(const struct model *model_, int* label);
|
60
|
+
double get_decfun_coef(const struct model *model_, int feat_idx, int label_idx);
|
61
|
+
double get_decfun_bias(const struct model *model_, int label_idx);
|
60
62
|
|
61
63
|
void free_model_content(struct model *model_ptr);
|
62
64
|
void free_and_destroy_model(struct model **model_ptr_ptr);
|
@@ -64,6 +66,7 @@ void destroy_param(struct parameter *param);
|
|
64
66
|
|
65
67
|
const char *check_parameter(const struct problem *prob, const struct parameter *param);
|
66
68
|
int check_probability_model(const struct model *model);
|
69
|
+
int check_regression_model(const struct model *model);
|
67
70
|
void set_print_string_function(void (*print_func) (const char*));
|
68
71
|
|
69
72
|
#ifdef __cplusplus
|
data/lib/liblinear/model.rb
CHANGED
@@ -23,15 +23,26 @@ module Liblinear
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# @return [Integer]
|
26
|
-
def
|
26
|
+
def class_size
|
27
27
|
get_nr_class(@model)
|
28
28
|
end
|
29
29
|
|
30
|
+
# @return [Integer]
|
31
|
+
def nr_class
|
32
|
+
warn "'nr_class' is deprecated. Please use 'class_size' instead."
|
33
|
+
class_size
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [Integer]
|
37
|
+
def feature_size
|
38
|
+
get_nr_feature(@model)
|
39
|
+
end
|
40
|
+
|
30
41
|
# @return [Array <Integer>]
|
31
42
|
def labels
|
32
|
-
c_int_array = new_int(
|
43
|
+
c_int_array = new_int(class_size)
|
33
44
|
get_labels(@model, c_int_array)
|
34
|
-
labels = int_array_c_to_ruby(c_int_array,
|
45
|
+
labels = int_array_c_to_ruby(c_int_array, class_size)
|
35
46
|
delete_int(c_int_array)
|
36
47
|
labels
|
37
48
|
end
|
@@ -62,14 +73,34 @@ module Liblinear
|
|
62
73
|
save_model(filename, @model)
|
63
74
|
end
|
64
75
|
|
65
|
-
|
76
|
+
# @param feature_index [Integer]
|
77
|
+
# @param label_index [Integer]
|
78
|
+
# @return [Double, Array <Double>]
|
79
|
+
def coefficient(feature_index = nil, label_index = 0)
|
80
|
+
return get_decfun_coef(@model, feature_index, label_index) if feature_index
|
81
|
+
coefficients = []
|
82
|
+
feature_size.times.map {|feature_index| get_decfun_coef(@model, feature_index + 1, label_index)}
|
83
|
+
end
|
84
|
+
|
85
|
+
# @param label_index [Integer]
|
86
|
+
# @return [Double]
|
87
|
+
def bias(label_index = 0)
|
88
|
+
get_decfun_bias(@model, label_index)
|
89
|
+
end
|
90
|
+
|
91
|
+
# @return [Boolean]
|
92
|
+
def regression_model?
|
93
|
+
check_regression_model(@model) == 1 ? true : false
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
66
97
|
# @param example [Array, Hash]
|
67
98
|
# @return [Hash]
|
68
99
|
def predict_prob_val(example, liblinear_func)
|
69
100
|
feature_nodes = convert_to_feature_node_array(example, @model.nr_feature, @model.bias)
|
70
|
-
c_double_array =
|
101
|
+
c_double_array = new_double(class_size)
|
71
102
|
Liblinearswig.send(liblinear_func, @model, feature_nodes, c_double_array)
|
72
|
-
values = double_array_c_to_ruby(c_double_array,
|
103
|
+
values = double_array_c_to_ruby(c_double_array, class_size)
|
73
104
|
delete_double(c_double_array)
|
74
105
|
feature_node_array_destroy(feature_nodes)
|
75
106
|
value_list = {}
|
data/lib/liblinear/version.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
##########################################
|
7
7
|
CXX = cl.exe
|
8
|
-
CFLAGS =
|
8
|
+
CFLAGS = /nologo /O2 /EHsc /I. /D _WIN32 /D _CRT_SECURE_NO_DEPRECATE
|
9
9
|
TARGET = windows
|
10
10
|
|
11
11
|
all: $(TARGET)\train.exe $(TARGET)\predict.exe
|
@@ -123,7 +123,7 @@ options:
|
|
123
123
|
-s 1, 3, 4 and 7
|
124
124
|
Dual maximal violation <= eps; similar to libsvm (default 0.1)
|
125
125
|
-s 5 and 6
|
126
|
-
|f'(w)|
|
126
|
+
|f'(w)|_1 <= eps*min(pos,neg)/l*|f'(w0)|_1,
|
127
127
|
where f is the primal function (default 0.01)
|
128
128
|
-s 12 and 13\n"
|
129
129
|
|f'(alpha)|_1 <= eps |f'(alpha0)|,
|
@@ -448,6 +448,24 @@ Library Usage
|
|
448
448
|
This function outputs the name of labels into an array called label.
|
449
449
|
For a regression model, label is unchanged.
|
450
450
|
|
451
|
+
- Function: double get_decfun_coef(const struct model *model_, int feat_idx,
|
452
|
+
int label_idx);
|
453
|
+
|
454
|
+
This function gives the coefficient for the feature with feature index =
|
455
|
+
feat_idx and the class with label index = label_idx. Note that feat_idx
|
456
|
+
starts from 1, while label_idx starts from 0. If feat_idx is not in the
|
457
|
+
valid range (1 to nr_feature), then a zero value will be returned. For
|
458
|
+
classification models, if label_idx is not in the valid range (0 to
|
459
|
+
nr_class-1), then a zero value will be returned; for regression models,
|
460
|
+
label_idx is ignored.
|
461
|
+
|
462
|
+
- Function: double get_decfun_bias(const struct model *model_, int label_idx);
|
463
|
+
|
464
|
+
This function gives the bias term corresponding to the class with the
|
465
|
+
label_idx. For classification models, if label_idx is not in a valid range
|
466
|
+
(0 to nr_class-1), then a zero value will be returned; for regression
|
467
|
+
models, label_idx is ignored.
|
468
|
+
|
451
469
|
- Function: const char *check_parameter(const struct problem *prob,
|
452
470
|
const struct parameter *param);
|
453
471
|
|
@@ -456,6 +474,16 @@ Library Usage
|
|
456
474
|
train() and cross_validation(). It returns NULL if the
|
457
475
|
parameters are feasible, otherwise an error message is returned.
|
458
476
|
|
477
|
+
- Function: int check_probability_model(const struct model *model);
|
478
|
+
|
479
|
+
This function returns 1 if the model supports probability output;
|
480
|
+
otherwise, it returns 0.
|
481
|
+
|
482
|
+
- Function: int check_regression_model(const struct model *model);
|
483
|
+
|
484
|
+
This function returns 1 if the model is a regression model; otherwise
|
485
|
+
it returns 0.
|
486
|
+
|
459
487
|
- Function: int save_model(const char *model_file_name,
|
460
488
|
const struct model *model_);
|
461
489
|
|
@@ -504,6 +532,9 @@ VC++ or where it is installed.
|
|
504
532
|
|
505
533
|
nmake -f Makefile.win clean all
|
506
534
|
|
535
|
+
2. (Optional) To build 64-bit windows binaries, you must
|
536
|
+
(1) Setup vcvars64.bat instead of vcvars32.bat
|
537
|
+
(2) Change CFLAGS in Makefile.win: /D _WIN32 to /D _WIN64
|
507
538
|
|
508
539
|
MATLAB/OCTAVE Interface
|
509
540
|
=======================
|