liblinear-ruby 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Gem Version](https://badge.fury.io/rb/liblinear-ruby.png)](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
|
=======================
|