numo-liblinear 1.2.2 → 2.0.0
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/CHANGELOG.md +5 -0
- data/LICENSE.txt +1 -1
- data/README.md +0 -5
- data/ext/numo/liblinear/extconf.rb +8 -14
- data/ext/numo/liblinear/liblinearext.cpp +215 -0
- data/ext/numo/liblinear/liblinearext.hpp +636 -0
- data/ext/numo/liblinear/src/COPYRIGHT +31 -0
- data/ext/numo/liblinear/{liblinear → src}/blas/blas.h +0 -0
- data/ext/numo/liblinear/{liblinear → src}/blas/blasp.h +0 -0
- data/ext/numo/liblinear/{liblinear → src}/blas/daxpy.c +0 -0
- data/ext/numo/liblinear/{liblinear → src}/blas/ddot.c +0 -0
- data/ext/numo/liblinear/{liblinear → src}/blas/dnrm2.c +0 -0
- data/ext/numo/liblinear/{liblinear → src}/blas/dscal.c +0 -0
- data/ext/numo/liblinear/{liblinear → src}/linear.cpp +0 -0
- data/ext/numo/liblinear/{liblinear → src}/linear.h +0 -0
- data/ext/numo/liblinear/{liblinear → src}/newton.cpp +0 -0
- data/ext/numo/liblinear/{liblinear → src}/newton.h +0 -0
- data/lib/numo/liblinear/version.rb +1 -1
- metadata +19 -37
- data/.github/workflows/build.yml +0 -29
- data/.gitignore +0 -20
- data/.gitmodules +0 -3
- data/.rspec +0 -3
- data/CODE_OF_CONDUCT.md +0 -74
- data/Gemfile +0 -11
- data/Rakefile +0 -15
- data/Steepfile +0 -20
- data/ext/numo/liblinear/converter.c +0 -133
- data/ext/numo/liblinear/converter.h +0 -18
- data/ext/numo/liblinear/liblinearext.c +0 -576
- data/ext/numo/liblinear/liblinearext.h +0 -17
- data/ext/numo/liblinear/model.c +0 -48
- data/ext/numo/liblinear/model.h +0 -15
- data/ext/numo/liblinear/parameter.c +0 -105
- data/ext/numo/liblinear/parameter.h +0 -15
- data/ext/numo/liblinear/problem.c +0 -92
- data/ext/numo/liblinear/problem.h +0 -12
- data/ext/numo/liblinear/solver_type.c +0 -36
- data/ext/numo/liblinear/solver_type.h +0 -9
- data/numo-liblinear.gemspec +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2be7c6e622882f6e9bde188d859e85cffff521041ec085a124925e356e33b3b
|
4
|
+
data.tar.gz: ba6ca472a2e81e4ce119f853d8178e14349690ded3dab957c93d14edaef077a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 703f37ebac8b88194070e13199452669fb5c38415e4b50f4ab310abf685249837aa20af27865d246f4683ccf871ed3aeb55639fca78909ff74e3ef30a84f3ce4
|
7
|
+
data.tar.gz: 4739ef305741e787801ad03f6fd24c4e6ca91ea28687f72683a24136f2c614766fc506a709b947df96f8e21a33b2f9ebb654af82964a75dc4df158f700548251
|
data/CHANGELOG.md
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -172,8 +172,3 @@ param = {
|
|
172
172
|
|
173
173
|
Bug reports and pull requests are welcome on GitHub at https://github.com/yoshoku/numo-liblinear.
|
174
174
|
This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
175
|
-
|
176
|
-
## Code of Conduct
|
177
|
-
|
178
|
-
Everyone interacting in the Numo::Liblinear project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow
|
179
|
-
the [code of conduct](https://github.com/yoshoku/numo-liblinear/blob/main/CODE_OF_CONDUCT.md).
|
@@ -8,10 +8,7 @@ $LOAD_PATH.each do |lp|
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
unless have_header('numo/narray.h')
|
12
|
-
puts 'numo/narray.h not found.'
|
13
|
-
exit(1)
|
14
|
-
end
|
11
|
+
abort 'numo/narray.h not found.' unless have_header('numo/narray.h')
|
15
12
|
|
16
13
|
if RUBY_PLATFORM =~ /mswin|cygwin|mingw/
|
17
14
|
$LOAD_PATH.each do |lp|
|
@@ -20,19 +17,16 @@ if RUBY_PLATFORM =~ /mswin|cygwin|mingw/
|
|
20
17
|
break
|
21
18
|
end
|
22
19
|
end
|
23
|
-
unless have_library('narray', 'nary_new')
|
24
|
-
puts 'libnarray.a not found.'
|
25
|
-
exit(1)
|
26
|
-
end
|
20
|
+
abort 'libnarray.a not found.' unless have_library('narray', 'nary_new')
|
27
21
|
end
|
28
22
|
|
29
|
-
|
23
|
+
abort 'libstdc++ is not found.' unless have_library('stdc++')
|
30
24
|
|
31
|
-
$srcs = Dir.glob("#{$srcdir}
|
32
|
-
$srcs.concat(%w[
|
25
|
+
$srcs = Dir.glob("#{$srcdir}/**/*.cpp").map { |path| File.basename(path) }
|
26
|
+
$srcs.concat(%w[daxpy.c ddot.c dnrm2.c dscal.c])
|
33
27
|
|
34
|
-
$INCFLAGS << " -I$(srcdir)/
|
35
|
-
$VPATH << "$(srcdir)/
|
36
|
-
$VPATH << "$(srcdir)/
|
28
|
+
$INCFLAGS << " -I$(srcdir)/src"
|
29
|
+
$VPATH << "$(srcdir)/src"
|
30
|
+
$VPATH << "$(srcdir)/src/blas"
|
37
31
|
|
38
32
|
create_makefile('numo/liblinear/liblinearext')
|
@@ -0,0 +1,215 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2019-2022 Atsushi Tatsuma
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
6
|
+
* modification, are permitted provided that the following conditions are met:
|
7
|
+
*
|
8
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
9
|
+
* list of conditions and the following disclaimer.
|
10
|
+
*
|
11
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
* this list of conditions and the following disclaimer in the documentation
|
13
|
+
* and/or other materials provided with the distribution.
|
14
|
+
*
|
15
|
+
* * Neither the name of the copyright holder nor the names of its
|
16
|
+
* contributors may be used to endorse or promote products derived from
|
17
|
+
* this software without specific prior written permission.
|
18
|
+
*
|
19
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
21
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
22
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
23
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
24
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
25
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
26
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
27
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
*/
|
30
|
+
|
31
|
+
#include "liblinearext.hpp"
|
32
|
+
|
33
|
+
extern "C" void Init_liblinearext(void) {
|
34
|
+
rb_require("numo/narray");
|
35
|
+
|
36
|
+
/**
|
37
|
+
* Document-module: Numo
|
38
|
+
* Numo is the top level namespace of NUmerical MOdules for Ruby.
|
39
|
+
*/
|
40
|
+
|
41
|
+
/**
|
42
|
+
* Document-module: Numo::Liblinear
|
43
|
+
* Numo::Liblinear is a binding library for LIBLINEAR that handles dataset with Numo::NArray.
|
44
|
+
*/
|
45
|
+
VALUE mLiblinear = rb_define_module_under(mNumo, "Liblinear");
|
46
|
+
|
47
|
+
/* The version of LIBLINEAR used in backgroud library. */
|
48
|
+
rb_define_const(mLiblinear, "LIBLINEAR_VERSION", INT2NUM(LIBLINEAR_VERSION));
|
49
|
+
|
50
|
+
/**
|
51
|
+
* Document-module: Numo::Liblinear::SolverType
|
52
|
+
* The module consisting of constants for solver type that used for parameter of LIBLINER.
|
53
|
+
*/
|
54
|
+
VALUE mSolverType = rb_define_module_under(mLiblinear, "SolverType");
|
55
|
+
/* L2-regularized logistic regression (primal) */
|
56
|
+
rb_define_const(mSolverType, "L2R_LR", INT2NUM(L2R_LR));
|
57
|
+
/* L2-regularized L2-loss support vector classification (dual) */
|
58
|
+
rb_define_const(mSolverType, "L2R_L2LOSS_SVC_DUAL", INT2NUM(L2R_L2LOSS_SVC_DUAL));
|
59
|
+
/* L2-regularized L2-loss support vector classification (primal) */
|
60
|
+
rb_define_const(mSolverType, "L2R_L2LOSS_SVC", INT2NUM(L2R_L2LOSS_SVC));
|
61
|
+
/* L2-regularized L1-loss support vector classification (dual) */
|
62
|
+
rb_define_const(mSolverType, "L2R_L1LOSS_SVC_DUAL", INT2NUM(L2R_L1LOSS_SVC_DUAL));
|
63
|
+
/* support vector classification by Crammer and Singer */
|
64
|
+
rb_define_const(mSolverType, "MCSVM_CS", INT2NUM(MCSVM_CS));
|
65
|
+
/* L1-regularized L2-loss support vector classification */
|
66
|
+
rb_define_const(mSolverType, "L1R_L2LOSS_SVC", INT2NUM(L1R_L2LOSS_SVC));
|
67
|
+
/* L1-regularized logistic regression */
|
68
|
+
rb_define_const(mSolverType, "L1R_LR", INT2NUM(L1R_LR));
|
69
|
+
/* L2-regularized logistic regression (dual) */
|
70
|
+
rb_define_const(mSolverType, "L2R_LR_DUAL", INT2NUM(L2R_LR_DUAL));
|
71
|
+
/* L2-regularized L2-loss support vector regression (primal) */
|
72
|
+
rb_define_const(mSolverType, "L2R_L2LOSS_SVR", INT2NUM(L2R_L2LOSS_SVR));
|
73
|
+
/* L2-regularized L2-loss support vector regression (dual) */
|
74
|
+
rb_define_const(mSolverType, "L2R_L2LOSS_SVR_DUAL", INT2NUM(L2R_L2LOSS_SVR_DUAL));
|
75
|
+
/* L2-regularized L1-loss support vector regression (dual) */
|
76
|
+
rb_define_const(mSolverType, "L2R_L1LOSS_SVR_DUAL", INT2NUM(L2R_L1LOSS_SVR_DUAL));
|
77
|
+
/* one-class support vector machine (dual) */
|
78
|
+
rb_define_const(mSolverType, "ONECLASS_SVM", INT2NUM(ONECLASS_SVM));
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Train the model according to the given training data.
|
82
|
+
*
|
83
|
+
* @overload train(x, y, param) -> Hash
|
84
|
+
* @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to be used for training the model.
|
85
|
+
* @param y [Numo::DFloat] (shape: [n_samples]) The labels or target values for samples.
|
86
|
+
* @param param [Hash] The parameters of a model.
|
87
|
+
*
|
88
|
+
* @example
|
89
|
+
* require 'numo/liblinear'
|
90
|
+
*
|
91
|
+
* # Prepare training dataset.
|
92
|
+
* x = Numo::DFloat[[-0.8, 1.0], [-0.5, 0.8], [0.9, -0.8], [0.8, -0.7]]
|
93
|
+
* y = Numo::Int32[-1, -1, 1, 1]
|
94
|
+
*
|
95
|
+
* # Train L2-regularized L2-loss support vector classifier.
|
96
|
+
* param = {
|
97
|
+
* solver_type: Numo::Liblinear::SolverType::L2R_L2LOSS_SVC_DUAL,
|
98
|
+
* C: 0.1,
|
99
|
+
* random_seed: 1
|
100
|
+
* }
|
101
|
+
* model = Numo::Liblinear.train(x, y, param)
|
102
|
+
*
|
103
|
+
* # Predict labels of test data.
|
104
|
+
* x_test = Numo::DFloat[[-0.7, 0.9], [0.5, -0.4]]
|
105
|
+
* result = Numo::Liblinear.predict(x_test, param, model)
|
106
|
+
* p result
|
107
|
+
* # Numo::DFloat#shape=[2]
|
108
|
+
* # [-1, 1]
|
109
|
+
*
|
110
|
+
* @raise [ArgumentError] If the sample array is not 2-dimensional, the label array is not 1-dimensional,
|
111
|
+
* the sample array and label array do not have the same number of samples, or
|
112
|
+
* the hyperparameter has an invalid value, this error is raised.
|
113
|
+
* @return [Hash] The model obtained from the training procedure.
|
114
|
+
*/
|
115
|
+
rb_define_module_function(mLiblinear, "train", RUBY_METHOD_FUNC(numo_liblinear_train), 3);
|
116
|
+
/**
|
117
|
+
* Perform cross validation under given parameters. The given samples are separated to n_fols folds.
|
118
|
+
* The predicted labels or values in the validation process are returned.
|
119
|
+
*
|
120
|
+
* @overload cv(x, y, param, n_folds) -> Numo::DFloat
|
121
|
+
* @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to be used for training the model.
|
122
|
+
* @param y [Numo::DFloat] (shape: [n_samples]) The labels or target values for samples.
|
123
|
+
* @param param [Hash] The parameters of a model.
|
124
|
+
* @param n_folds [Integer] The number of folds.
|
125
|
+
*
|
126
|
+
* @example
|
127
|
+
* require 'numo/liblinear'
|
128
|
+
*
|
129
|
+
* # x: samples
|
130
|
+
* # y: labels
|
131
|
+
*
|
132
|
+
* # Define parameters of L2-regularized L2-loss support vector classification.
|
133
|
+
* param = {
|
134
|
+
* solver_type: Numo::Liblinear::SolverType::L2R_L2LOSS_SVC_DUAL,
|
135
|
+
* C: 1,
|
136
|
+
* random_seed: 1,
|
137
|
+
* verbose: true
|
138
|
+
* }
|
139
|
+
*
|
140
|
+
* # Perform 5-cross validation.
|
141
|
+
* n_folds = 5
|
142
|
+
* res = Numo::Liblinear::cv(x, y, param, n_folds)
|
143
|
+
*
|
144
|
+
* # Print mean accuracy.
|
145
|
+
* mean_accuracy = y.eq(res).count.fdiv(y.size)
|
146
|
+
* puts "Accuracy: %.1f %%" % (100 * mean_accuracy)
|
147
|
+
*
|
148
|
+
* @raise [ArgumentError] If the sample array is not 2-dimensional, the label array is not 1-dimensional,
|
149
|
+
* the sample array and label array do not have the same number of samples, or
|
150
|
+
* the hyperparameter has an invalid value, this error is raised.
|
151
|
+
* @return [Numo::DFloat] (shape: [n_samples]) The predicted class label or value of each sample.
|
152
|
+
*/
|
153
|
+
rb_define_module_function(mLiblinear, "cv", RUBY_METHOD_FUNC(numo_liblinear_cross_validation), 4);
|
154
|
+
/**
|
155
|
+
* Predict class labels or values for given samples.
|
156
|
+
*
|
157
|
+
* @overload predict(x, param, model) -> Numo::DFloat
|
158
|
+
* @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to calculate the scores.
|
159
|
+
* @param param [Hash] The parameters of the trained model.
|
160
|
+
* @param model [Hash] The model obtained from the training procedure.
|
161
|
+
*
|
162
|
+
* @raise [ArgumentError] If the sample array is not 2-dimensional, this error is raised.
|
163
|
+
* @return [Numo::DFloat] (shape: [n_samples]) The predicted class label or value of each sample.
|
164
|
+
*/
|
165
|
+
rb_define_module_function(mLiblinear, "predict", RUBY_METHOD_FUNC(numo_liblinear_predict), 3);
|
166
|
+
/**
|
167
|
+
* Calculate decision values for given samples.
|
168
|
+
*
|
169
|
+
* @overload decision_function(x, param, model) -> Numo::DFloat
|
170
|
+
* @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to calculate the scores.
|
171
|
+
* @param param [Hash] The parameters of the trained model.
|
172
|
+
* @param model [Hash] The model obtained from the training procedure.
|
173
|
+
*
|
174
|
+
* @raise [ArgumentError] If the sample array is not 2-dimensional, this error is raised.
|
175
|
+
* @return [Numo::DFloat] (shape: [n_samples, n_classes]) The decision value of each sample.
|
176
|
+
*/
|
177
|
+
rb_define_module_function(mLiblinear, "decision_function", RUBY_METHOD_FUNC(numo_liblinear_decision_function), 3);
|
178
|
+
/**
|
179
|
+
* Predict class probability for given samples.
|
180
|
+
* The model must have probability information calcualted in training procedure.
|
181
|
+
* The method supports only the logistic regression.
|
182
|
+
*
|
183
|
+
* @overload predict_proba(x, param, model) -> Numo::DFloat
|
184
|
+
* @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the class probabilities.
|
185
|
+
* @param param [Hash] The parameters of the trained Logistic Regression model.
|
186
|
+
* @param model [Hash] The model obtained from the training procedure.
|
187
|
+
*
|
188
|
+
* @raise [ArgumentError] If the sample array is not 2-dimensional, this error is raised.
|
189
|
+
* @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted probablity of each class per sample.
|
190
|
+
*/
|
191
|
+
rb_define_module_function(mLiblinear, "predict_proba", RUBY_METHOD_FUNC(numo_liblinear_predict_proba), 3);
|
192
|
+
/**
|
193
|
+
* Load the parameters and model from a text file with LIBLINEAR format.
|
194
|
+
*
|
195
|
+
* @overload load_model(filename) -> Array
|
196
|
+
* @param filename [String] The path to a file to load.
|
197
|
+
*
|
198
|
+
* @raise [IOError] This error raises when failed to load the model file.
|
199
|
+
* @return [Array] Array contains the parameters and model.
|
200
|
+
*/
|
201
|
+
rb_define_module_function(mLiblinear, "load_model", RUBY_METHOD_FUNC(numo_liblinear_load_model), 1);
|
202
|
+
/**
|
203
|
+
* Save the parameters and model as a text file with LIBLINEAR format. The saved file can be used with the liblinear tools.
|
204
|
+
* Note that the save_model saves only the parameters necessary for estimation with the trained model.
|
205
|
+
*
|
206
|
+
* @overload save_model(filename, param, model) -> Boolean
|
207
|
+
* @param filename [String] The path to a file to save.
|
208
|
+
* @param param [Hash] The parameters of the trained model.
|
209
|
+
* @param model [Hash] The model obtained from the training procedure.
|
210
|
+
*
|
211
|
+
* @raise [IOError] This error raises when failed to save the model file.
|
212
|
+
* @return [Boolean] true on success, or false if an error occurs.
|
213
|
+
*/
|
214
|
+
rb_define_module_function(mLiblinear, "save_model", RUBY_METHOD_FUNC(numo_liblinear_save_model), 3);
|
215
|
+
}
|