svmkit 0.2.9 → 0.3.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/.rubocop.yml +2 -2
- data/HISTORY.md +11 -0
- data/lib/svmkit/base/classifier.rb +4 -1
- data/lib/svmkit/base/regressor.rb +34 -0
- data/lib/svmkit/ensemble/random_forest_classifier.rb +1 -0
- data/lib/svmkit/evaluation_measure/accuracy.rb +2 -1
- data/lib/svmkit/evaluation_measure/f_score.rb +2 -1
- data/lib/svmkit/evaluation_measure/log_loss.rb +4 -2
- data/lib/svmkit/evaluation_measure/mean_absolute_error.rb +30 -0
- data/lib/svmkit/evaluation_measure/mean_squared_error.rb +30 -0
- data/lib/svmkit/evaluation_measure/precision.rb +2 -1
- data/lib/svmkit/evaluation_measure/r2_score.rb +44 -0
- data/lib/svmkit/evaluation_measure/recall.rb +2 -1
- data/lib/svmkit/kernel_approximation/rbf.rb +1 -0
- data/lib/svmkit/kernel_machine/kernel_svc.rb +3 -1
- data/lib/svmkit/linear_model/logistic_regression.rb +2 -1
- data/lib/svmkit/linear_model/svc.rb +3 -1
- data/lib/svmkit/linear_model/svr.rb +172 -0
- data/lib/svmkit/model_selection/cross_validation.rb +19 -7
- data/lib/svmkit/model_selection/k_fold.rb +1 -0
- data/lib/svmkit/model_selection/stratified_k_fold.rb +1 -0
- data/lib/svmkit/multiclass/one_vs_rest_classifier.rb +1 -0
- data/lib/svmkit/naive_bayes/naive_bayes.rb +1 -0
- data/lib/svmkit/nearest_neighbors/k_neighbors_classifier.rb +1 -0
- data/lib/svmkit/nearest_neighbors/k_neighbors_regressor.rb +94 -0
- data/lib/svmkit/pairwise_metric.rb +2 -0
- data/lib/svmkit/polynomial_model/factorization_machine_classifier.rb +2 -1
- data/lib/svmkit/preprocessing/l2_normalizer.rb +1 -0
- data/lib/svmkit/preprocessing/label_encoder.rb +1 -0
- data/lib/svmkit/preprocessing/min_max_scaler.rb +1 -0
- data/lib/svmkit/preprocessing/one_hot_encoder.rb +1 -0
- data/lib/svmkit/preprocessing/standard_scaler.rb +1 -0
- data/lib/svmkit/probabilistic_output.rb +1 -1
- data/lib/svmkit/tree/decision_tree_classifier.rb +1 -1
- data/lib/svmkit/validation.rb +12 -0
- data/lib/svmkit/version.rb +1 -1
- data/lib/svmkit.rb +6 -0
- data/svmkit.gemspec +1 -10
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 855d3ac2dcfbfde9eb82a4661f17cebb75b4b7c57ba37ee26a8aa03d0f1ccab8
|
4
|
+
data.tar.gz: 13ec3e84fd6f4fcd973d164b3d6f395c024e42095eae63819bea6ef4179697d9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be8b4e4528e70ab99c8b9f1ad0d93d717b0359d30ca9b142b4d5cb44b6b3875cc9d97f199021ab48ab3b9cc1e635f37c14dbb15efe81b55de673d83b65cc10ab
|
7
|
+
data.tar.gz: 9c8ae85dc3ca8dd7fe6bd15bd4b3eb46b775b32923691a12f9621032bcbffea7a3405404a9b8924f68a344d771cac56f439e6e2c024f68deacd00d7358c3c4f4
|
data/.rubocop.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
inherit_from: .rubocop_todo.yml
|
2
2
|
|
3
3
|
AllCops:
|
4
|
-
TargetRubyVersion: 2.
|
4
|
+
TargetRubyVersion: 2.1
|
5
5
|
DisplayCopNames: true
|
6
6
|
DisplayStyleGuide: true
|
7
7
|
|
@@ -9,7 +9,7 @@ Documentation:
|
|
9
9
|
Enabled: false
|
10
10
|
|
11
11
|
Metrics/LineLength:
|
12
|
-
Max:
|
12
|
+
Max: 145
|
13
13
|
IgnoredPatterns: ['(\A|\s)#']
|
14
14
|
|
15
15
|
Metrics/ModuleLength:
|
data/HISTORY.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# 0.3.0
|
2
|
+
- Add class for Support Vector Regression.
|
3
|
+
- Add class for K-Nearest Neighbor Regression.
|
4
|
+
- Add class for evaluating coefficient of determination.
|
5
|
+
- Add class for evaluating mean squared error.
|
6
|
+
- Add class for evaluating mean absolute error.
|
7
|
+
- Fix to use min method instead of sort and first methods.
|
8
|
+
- Fix cross validation class to be able to use for regression problem.
|
9
|
+
- Fix some typos on document.
|
10
|
+
- Rename spec filename for Factorization Machine classifier.
|
11
|
+
|
1
12
|
# 0.2.9
|
2
13
|
- Add predict_proba method to SVC and KernelSVC.
|
3
14
|
- Add class for evaluating logarithmic loss.
|
@@ -1,5 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
4
|
+
require 'svmkit/evaluation_measure/accuracy'
|
5
|
+
|
3
6
|
module SVMKit
|
4
7
|
module Base
|
5
8
|
# Module for all classifiers in SVMKit.
|
@@ -14,7 +17,7 @@ module SVMKit
|
|
14
17
|
raise NotImplementedError, "#{__method__} has to be implemented in #{self.class}."
|
15
18
|
end
|
16
19
|
|
17
|
-
#
|
20
|
+
# Calculate the mean accuracy of the given testing data.
|
18
21
|
#
|
19
22
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) Testing data.
|
20
23
|
# @param y [Numo::Int32] (shape: [n_samples]) True labels for testing data.
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'svmkit/validation'
|
4
|
+
require 'svmkit/evaluation_measure/r2_score'
|
5
|
+
|
6
|
+
module SVMKit
|
7
|
+
module Base
|
8
|
+
# Module for all regressors in SVMKit.
|
9
|
+
module Regressor
|
10
|
+
# An abstract method for fitting a model.
|
11
|
+
def fit
|
12
|
+
raise NotImplementedError, "#{__method__} has to be implemented in #{self.class}."
|
13
|
+
end
|
14
|
+
|
15
|
+
# An abstract method for predicting labels.
|
16
|
+
def predict
|
17
|
+
raise NotImplementedError, "#{__method__} has to be implemented in #{self.class}."
|
18
|
+
end
|
19
|
+
|
20
|
+
# Calculate the coefficient of determination for the given testing data.
|
21
|
+
#
|
22
|
+
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) Testing data.
|
23
|
+
# @param y [Numo::DFloat] (shape: [n_samples, n_outputs]) Target values for testing data.
|
24
|
+
# @return [Float] Coefficient of determination
|
25
|
+
def score(x, y)
|
26
|
+
SVMKit::Validation.check_sample_array(x)
|
27
|
+
SVMKit::Validation.check_tvalue_array(y)
|
28
|
+
SVMKit::Validation.check_sample_tvalue_size(x, y)
|
29
|
+
evaluator = SVMKit::EvaluationMeasure::R2Score.new
|
30
|
+
evaluator.score(y, predict(x))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
3
4
|
require 'svmkit/base/evaluator'
|
4
5
|
|
5
6
|
module SVMKit
|
@@ -13,7 +14,7 @@ module SVMKit
|
|
13
14
|
class Accuracy
|
14
15
|
include Base::Evaluator
|
15
16
|
|
16
|
-
#
|
17
|
+
# Calculate mean accuracy.
|
17
18
|
#
|
18
19
|
# @param y_true [Numo::Int32] (shape: [n_samples]) Ground truth labels.
|
19
20
|
# @param y_pred [Numo::Int32] (shape: [n_samples]) Predicted labels.
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
3
4
|
require 'svmkit/base/evaluator'
|
4
5
|
require 'svmkit/evaluation_measure/precision_recall'
|
5
6
|
|
@@ -27,7 +28,7 @@ module SVMKit
|
|
27
28
|
@average = average
|
28
29
|
end
|
29
30
|
|
30
|
-
#
|
31
|
+
# Calculate average F1-score
|
31
32
|
#
|
32
33
|
# @param y_true [Numo::Int32] (shape: [n_samples]) Ground truth labels.
|
33
34
|
# @param y_pred [Numo::Int32] (shape: [n_samples]) Predicted labels.
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
3
4
|
require 'svmkit/base/evaluator'
|
5
|
+
require 'svmkit/preprocessing/one_hot_encoder'
|
4
6
|
|
5
7
|
module SVMKit
|
6
8
|
module EvaluationMeasure
|
@@ -12,7 +14,7 @@ module SVMKit
|
|
12
14
|
class LogLoss
|
13
15
|
include Base::Evaluator
|
14
16
|
|
15
|
-
#
|
17
|
+
# Calculate mean logarithmic loss.
|
16
18
|
# If both y_true and y_pred are array (both shapes are [n_samples]), this method calculates
|
17
19
|
# mean logarithmic loss for binary classification.
|
18
20
|
#
|
@@ -28,7 +30,7 @@ module SVMKit
|
|
28
30
|
clipped_p = y_pred.clip(eps, 1 - eps)
|
29
31
|
|
30
32
|
log_loss = if n_classes.nil?
|
31
|
-
negative_label = y_true.to_a.uniq.
|
33
|
+
negative_label = y_true.to_a.uniq.min
|
32
34
|
bin_y_true = Numo::DFloat.cast(y_true.ne(negative_label))
|
33
35
|
-(bin_y_true * Numo::NMath.log(clipped_p) + (1 - bin_y_true) * Numo::NMath.log(1 - clipped_p))
|
34
36
|
else
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'svmkit/validation'
|
4
|
+
require 'svmkit/base/evaluator'
|
5
|
+
|
6
|
+
module SVMKit
|
7
|
+
module EvaluationMeasure
|
8
|
+
# MeanAbsoluteError is a class that calculates the mean absolute error.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# evaluator = SVMKit::EvaluationMeasure::MeanAbsoluteError.new
|
12
|
+
# puts evaluator.score(ground_truth, predicted)
|
13
|
+
class MeanAbsoluteError
|
14
|
+
include Base::Evaluator
|
15
|
+
|
16
|
+
# Calculate mean absolute error.
|
17
|
+
#
|
18
|
+
# @param y_true [Numo::DFloat] (shape: [n_samples, n_outputs]) Ground truth target values.
|
19
|
+
# @param y_pred [Numo::DFloat] (shape: [n_samples, n_outputs]) Estimated target values.
|
20
|
+
# @return [Float] Mean absolute error
|
21
|
+
def score(y_true, y_pred)
|
22
|
+
SVMKit::Validation.check_tvalue_array(y_true)
|
23
|
+
SVMKit::Validation.check_tvalue_array(y_pred)
|
24
|
+
raise ArgumentError, 'Expect to have the same size both y_true and y_pred.' unless y_true.shape == y_pred.shape
|
25
|
+
|
26
|
+
(y_true - y_pred).abs.mean
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'svmkit/validation'
|
4
|
+
require 'svmkit/base/evaluator'
|
5
|
+
|
6
|
+
module SVMKit
|
7
|
+
module EvaluationMeasure
|
8
|
+
# MeanSquaredError is a class that calculates the mean squared error.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# evaluator = SVMKit::EvaluationMeasure::MeanSquaredError.new
|
12
|
+
# puts evaluator.score(ground_truth, predicted)
|
13
|
+
class MeanSquaredError
|
14
|
+
include Base::Evaluator
|
15
|
+
|
16
|
+
# Calculate mean squared error.
|
17
|
+
#
|
18
|
+
# @param y_true [Numo::DFloat] (shape: [n_samples, n_outputs]) Ground truth target values.
|
19
|
+
# @param y_pred [Numo::DFloat] (shape: [n_samples, n_outputs]) Estimated target values.
|
20
|
+
# @return [Float] Mean squared error
|
21
|
+
def score(y_true, y_pred)
|
22
|
+
SVMKit::Validation.check_tvalue_array(y_true)
|
23
|
+
SVMKit::Validation.check_tvalue_array(y_pred)
|
24
|
+
raise ArgumentError, 'Expect to have the same size both y_true and y_pred.' unless y_true.shape == y_pred.shape
|
25
|
+
|
26
|
+
((y_true - y_pred)**2).mean
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
3
4
|
require 'svmkit/base/evaluator'
|
4
5
|
require 'svmkit/evaluation_measure/precision_recall'
|
5
6
|
|
@@ -27,7 +28,7 @@ module SVMKit
|
|
27
28
|
@average = average
|
28
29
|
end
|
29
30
|
|
30
|
-
#
|
31
|
+
# Calculate average precision.
|
31
32
|
#
|
32
33
|
# @param y_true [Numo::Int32] (shape: [n_samples]) Ground truth labels.
|
33
34
|
# @param y_pred [Numo::Int32] (shape: [n_samples]) Predicted labels.
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'svmkit/validation'
|
4
|
+
require 'svmkit/base/evaluator'
|
5
|
+
require 'svmkit/evaluation_measure/precision_recall'
|
6
|
+
|
7
|
+
module SVMKit
|
8
|
+
module EvaluationMeasure
|
9
|
+
# R2Score is a class that calculates the coefficient of determination for the predicted values.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# evaluator = SVMKit::EvaluationMeasure::R2Score.new
|
13
|
+
# puts evaluator.score(ground_truth, predicted)
|
14
|
+
class R2Score
|
15
|
+
include Base::Evaluator
|
16
|
+
|
17
|
+
# Create a new evaluation measure calculater for coefficient of determination.
|
18
|
+
def initialize; end
|
19
|
+
|
20
|
+
# Calculate the coefficient of determination.
|
21
|
+
#
|
22
|
+
# @param y_true [Numo::DFloat] (shape: [n_samples, n_outputs]) Ground truth target values.
|
23
|
+
# @param y_pred [Numo::DFloat] (shape: [n_samples, n_outputs]) Estimated taget values.
|
24
|
+
# @return [Float] Coefficient of determination
|
25
|
+
def score(y_true, y_pred)
|
26
|
+
SVMKit::Validation.check_tvalue_array(y_true)
|
27
|
+
SVMKit::Validation.check_tvalue_array(y_pred)
|
28
|
+
raise ArgumentError, 'Expect to have the same size both y_true and y_pred.' unless y_true.shape == y_pred.shape
|
29
|
+
|
30
|
+
n_samples, n_outputs = y_true.shape
|
31
|
+
numerator = ((y_true - y_pred)**2).sum(0)
|
32
|
+
yt_mean = y_true.sum(0) / n_samples
|
33
|
+
denominator = ((y_true - yt_mean)**2).sum(0)
|
34
|
+
if n_outputs.nil?
|
35
|
+
denominator.zero? ? 0.0 : 1.0 - numerator / denominator
|
36
|
+
else
|
37
|
+
scores = 1 - numerator / denominator
|
38
|
+
scores[denominator.eq(0)] = 0.0
|
39
|
+
scores.sum / scores.size
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
3
4
|
require 'svmkit/base/evaluator'
|
4
5
|
require 'svmkit/evaluation_measure/precision_recall'
|
5
6
|
|
@@ -27,7 +28,7 @@ module SVMKit
|
|
27
28
|
@average = average
|
28
29
|
end
|
29
30
|
|
30
|
-
#
|
31
|
+
# Calculate average recall
|
31
32
|
#
|
32
33
|
# @param y_true [Numo::Int32] (shape: [n_samples]) Ground truth labels.
|
33
34
|
# @param y_pred [Numo::Int32] (shape: [n_samples]) Predicted labels.
|
@@ -1,7 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
3
4
|
require 'svmkit/base/base_estimator'
|
4
5
|
require 'svmkit/base/classifier'
|
6
|
+
require 'svmkit/probabilistic_output'
|
5
7
|
|
6
8
|
module SVMKit
|
7
9
|
# This module consists of the classes that implement kernel method-based estimator.
|
@@ -88,7 +90,7 @@ module SVMKit
|
|
88
90
|
end
|
89
91
|
end
|
90
92
|
else
|
91
|
-
negative_label = y.to_a.uniq.
|
93
|
+
negative_label = y.to_a.uniq.min
|
92
94
|
bin_y = Numo::Int32.cast(y.ne(negative_label)) * 2 - 1
|
93
95
|
@weight_vec = binary_fit(x, bin_y)
|
94
96
|
@prob_param = if @params[:probability]
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
3
4
|
require 'svmkit/base/base_estimator'
|
4
5
|
require 'svmkit/base/classifier'
|
5
6
|
|
@@ -95,7 +96,7 @@ module SVMKit
|
|
95
96
|
@bias_term[n] = bias
|
96
97
|
end
|
97
98
|
else
|
98
|
-
negative_label = y.to_a.uniq.
|
99
|
+
negative_label = y.to_a.uniq.min
|
99
100
|
bin_y = Numo::Int32.cast(y.ne(negative_label)) * 2 - 1
|
100
101
|
@weight_vec, @bias_term = binary_fit(x, bin_y)
|
101
102
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
3
4
|
require 'svmkit/base/base_estimator'
|
4
5
|
require 'svmkit/base/classifier'
|
6
|
+
require 'svmkit/probabilistic_output'
|
5
7
|
|
6
8
|
module SVMKit
|
7
9
|
# This module consists of the classes that implement generalized linear models.
|
@@ -103,7 +105,7 @@ module SVMKit
|
|
103
105
|
end
|
104
106
|
end
|
105
107
|
else
|
106
|
-
negative_label = y.to_a.uniq.
|
108
|
+
negative_label = y.to_a.uniq.min
|
107
109
|
bin_y = Numo::Int32.cast(y.ne(negative_label)) * 2 - 1
|
108
110
|
@weight_vec, @bias_term = binary_fit(x, bin_y)
|
109
111
|
@prob_param = if @params[:probability]
|
@@ -0,0 +1,172 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'svmkit/validation'
|
4
|
+
require 'svmkit/base/base_estimator'
|
5
|
+
require 'svmkit/base/regressor'
|
6
|
+
|
7
|
+
module SVMKit
|
8
|
+
module LinearModel
|
9
|
+
# SVR is a class that implements Support Vector Regressor
|
10
|
+
# with stochastic gradient descent (SGD) optimization.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# estimator =
|
14
|
+
# SVMKit::LinearModel::SVR.new(reg_param: 1.0, epsilon: 0.1, max_iter: 100, batch_size: 20, random_seed: 1)
|
15
|
+
# estimator.fit(training_samples, traininig_target_values)
|
16
|
+
# results = estimator.predict(testing_samples)
|
17
|
+
#
|
18
|
+
# *Reference*
|
19
|
+
# 1. S. Shalev-Shwartz and Y. Singer, "Pegasos: Primal Estimated sub-GrAdient SOlver for SVM," Proc. ICML'07, pp. 807--814, 2007.
|
20
|
+
class SVR
|
21
|
+
include Base::BaseEstimator
|
22
|
+
include Base::Regressor
|
23
|
+
|
24
|
+
# Return the weight vector for SVC.
|
25
|
+
# @return [Numo::DFloat] (shape: [n_outputs, n_features])
|
26
|
+
attr_reader :weight_vec
|
27
|
+
|
28
|
+
# Return the bias term (a.k.a. intercept) for SVC.
|
29
|
+
# @return [Numo::DFloat] (shape: [n_outputs])
|
30
|
+
attr_reader :bias_term
|
31
|
+
|
32
|
+
# Return the random generator for performing random sampling.
|
33
|
+
# @return [Random]
|
34
|
+
attr_reader :rng
|
35
|
+
|
36
|
+
# Create a new regressor with Support Vector Machine by the SGD optimization.
|
37
|
+
#
|
38
|
+
# @param reg_param [Float] The regularization parameter.
|
39
|
+
# @param fit_bias [Boolean] The flag indicating whether to fit the bias term.
|
40
|
+
# @param bias_scale [Float] The scale of the bias term.
|
41
|
+
# @param epsilon [Float] The margin of tolerance.
|
42
|
+
# @param max_iter [Integer] The maximum number of iterations.
|
43
|
+
# @param batch_size [Integer] The size of the mini batches.
|
44
|
+
# @param normalize [Boolean] The flag indicating whether to normalize the weight vector.
|
45
|
+
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
46
|
+
def initialize(reg_param: 1.0, fit_bias: false, bias_scale: 1.0, epsilon: 0.1,
|
47
|
+
max_iter: 100, batch_size: 50, normalize: true, random_seed: nil)
|
48
|
+
SVMKit::Validation.check_params_float(reg_param: reg_param, bias_scale: bias_scale, epsilon: epsilon)
|
49
|
+
SVMKit::Validation.check_params_integer(max_iter: max_iter, batch_size: batch_size)
|
50
|
+
SVMKit::Validation.check_params_boolean(fit_bias: fit_bias, normalize: normalize)
|
51
|
+
SVMKit::Validation.check_params_type_or_nil(Integer, random_seed: random_seed)
|
52
|
+
SVMKit::Validation.check_params_positive(reg_param: reg_param, bias_scale: bias_scale, epsilon: epsilon,
|
53
|
+
max_iter: max_iter, batch_size: batch_size)
|
54
|
+
@params = {}
|
55
|
+
@params[:reg_param] = reg_param
|
56
|
+
@params[:fit_bias] = fit_bias
|
57
|
+
@params[:bias_scale] = bias_scale
|
58
|
+
@params[:epsilon] = epsilon
|
59
|
+
@params[:max_iter] = max_iter
|
60
|
+
@params[:batch_size] = batch_size
|
61
|
+
@params[:normalize] = normalize
|
62
|
+
@params[:random_seed] = random_seed
|
63
|
+
@params[:random_seed] ||= srand
|
64
|
+
@weight_vec = nil
|
65
|
+
@bias_term = nil
|
66
|
+
@rng = Random.new(@params[:random_seed])
|
67
|
+
end
|
68
|
+
|
69
|
+
# Fit the model with given training data.
|
70
|
+
#
|
71
|
+
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The training data to be used for fitting the model.
|
72
|
+
# @param y [Numo::DFloat] (shape: [n_samples, n_outputs]) The target values to be used for fitting the model.
|
73
|
+
# @return [SVR] The learned regressor itself.
|
74
|
+
def fit(x, y)
|
75
|
+
SVMKit::Validation.check_sample_array(x)
|
76
|
+
SVMKit::Validation.check_tvalue_array(y)
|
77
|
+
SVMKit::Validation.check_sample_tvalue_size(x, y)
|
78
|
+
|
79
|
+
n_outputs = y.shape[1].nil? ? 1 : y.shape[1]
|
80
|
+
_n_samples, n_features = x.shape
|
81
|
+
|
82
|
+
if n_outputs > 1
|
83
|
+
@weight_vec = Numo::DFloat.zeros(n_outputs, n_features)
|
84
|
+
@bias_term = Numo::DFloat.zeros(n_outputs)
|
85
|
+
n_outputs.times do |n|
|
86
|
+
weight, bias = single_fit(x, y[true, n])
|
87
|
+
@weight_vec[n, true] = weight
|
88
|
+
@bias_term[n] = bias
|
89
|
+
end
|
90
|
+
else
|
91
|
+
@weight_vec, @bias_term = single_fit(x, y)
|
92
|
+
end
|
93
|
+
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
# Predict values for samples.
|
98
|
+
#
|
99
|
+
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the values.
|
100
|
+
# @return [Numo::DFloat] (shape: [n_samples, n_outputs]) Predicted values per sample.
|
101
|
+
def predict(x)
|
102
|
+
SVMKit::Validation.check_sample_array(x)
|
103
|
+
x.dot(@weight_vec.transpose) + @bias_term
|
104
|
+
end
|
105
|
+
|
106
|
+
# Dump marshal data.
|
107
|
+
# @return [Hash] The marshal data about SVC.
|
108
|
+
def marshal_dump
|
109
|
+
{ params: @params,
|
110
|
+
weight_vec: @weight_vec,
|
111
|
+
bias_term: @bias_term,
|
112
|
+
rng: @rng }
|
113
|
+
end
|
114
|
+
|
115
|
+
# Load marshal data.
|
116
|
+
# @return [nil]
|
117
|
+
def marshal_load(obj)
|
118
|
+
@params = obj[:params]
|
119
|
+
@weight_vec = obj[:weight_vec]
|
120
|
+
@bias_term = obj[:bias_term]
|
121
|
+
@rng = obj[:rng]
|
122
|
+
nil
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def single_fit(x, y)
|
128
|
+
# Expand feature vectors for bias term.
|
129
|
+
samples = @params[:fit_bias] ? expand_feature(x) : x
|
130
|
+
# Initialize some variables.
|
131
|
+
n_samples, n_features = samples.shape
|
132
|
+
rand_ids = [*0...n_samples].shuffle(random: @rng)
|
133
|
+
weight_vec = Numo::DFloat.zeros(n_features)
|
134
|
+
# Start optimization.
|
135
|
+
@params[:max_iter].times do |t|
|
136
|
+
# random sampling
|
137
|
+
subset_ids = rand_ids.shift(@params[:batch_size])
|
138
|
+
rand_ids.concat(subset_ids)
|
139
|
+
# update the weight vector.
|
140
|
+
z = samples[subset_ids, true].dot(weight_vec.transpose)
|
141
|
+
coef = Numo::DFloat.zeros(@params[:batch_size])
|
142
|
+
coef[(z - y[subset_ids]).gt(@params[:epsilon]).where] = 1
|
143
|
+
coef[(y[subset_ids] - z).gt(@params[:epsilon]).where] = -1
|
144
|
+
mean_vec = samples[subset_ids, true].transpose.dot(coef) / @params[:batch_size]
|
145
|
+
weight_vec -= learning_rate(t) * (@params[:reg_param] * weight_vec + mean_vec)
|
146
|
+
# scale the weight vector.
|
147
|
+
normalize_weight_vec(weight_vec) if @params[:normalize]
|
148
|
+
end
|
149
|
+
split_weight_vec_bias(weight_vec)
|
150
|
+
end
|
151
|
+
|
152
|
+
def expand_feature(x)
|
153
|
+
Numo::NArray.hstack([x, Numo::DFloat.ones([x.shape[0], 1]) * @params[:bias_scale]])
|
154
|
+
end
|
155
|
+
|
156
|
+
def learning_rate(iter)
|
157
|
+
1.0 / (@params[:reg_param] * (iter + 1))
|
158
|
+
end
|
159
|
+
|
160
|
+
def normalize_weight_vec(weight_vec)
|
161
|
+
norm = Math.sqrt(weight_vec.dot(weight_vec))
|
162
|
+
weight_vec * [1.0, (1.0 / @params[:reg_param]**0.5) / (norm + 1.0e-12)].min
|
163
|
+
end
|
164
|
+
|
165
|
+
def split_weight_vec_bias(weight_vec)
|
166
|
+
weights = @params[:fit_bias] ? weight_vec[0...-1] : weight_vec
|
167
|
+
bias = @params[:fit_bias] ? weight_vec[-1] : 0.0
|
168
|
+
[weights, bias]
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -1,6 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
4
|
+
require 'svmkit/base/base_estimator'
|
5
|
+
require 'svmkit/base/classifier'
|
6
|
+
require 'svmkit/base/regressor'
|
3
7
|
require 'svmkit/base/splitter'
|
8
|
+
require 'svmkit/base/evaluator'
|
9
|
+
require 'svmkit/evaluation_measure/log_loss'
|
4
10
|
|
5
11
|
module SVMKit
|
6
12
|
# This module consists of the classes for model validation techniques.
|
@@ -51,9 +57,9 @@ module SVMKit
|
|
51
57
|
# Perform the evalution of given classifier with cross-validation method.
|
52
58
|
#
|
53
59
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features])
|
54
|
-
# The dataset to be used to evaluate the
|
55
|
-
# @param y [Numo::Int32] (shape: [n_samples])
|
56
|
-
# The labels to be used to evaluate the classifier.
|
60
|
+
# The dataset to be used to evaluate the estimator.
|
61
|
+
# @param y [Numo::Int32 / Numo::DFloat] (shape: [n_samples] / [n_samples, n_outputs])
|
62
|
+
# The labels to be used to evaluate the classifier / The target values to be used to evaluate the regressor.
|
57
63
|
# @return [Hash] The report summarizing the results of cross-validation.
|
58
64
|
# * :fit_time (Array<Float>) The calculation times of fitting the estimator for each split.
|
59
65
|
# * :test_score (Array<Float>) The scores of testing dataset for each split.
|
@@ -61,8 +67,14 @@ module SVMKit
|
|
61
67
|
# the return_train_score is false.
|
62
68
|
def perform(x, y)
|
63
69
|
SVMKit::Validation.check_sample_array(x)
|
64
|
-
SVMKit::
|
65
|
-
|
70
|
+
if @estimator.is_a?(SVMKit::Base::Classifier)
|
71
|
+
SVMKit::Validation.check_label_array(y)
|
72
|
+
SVMKit::Validation.check_sample_label_size(x, y)
|
73
|
+
end
|
74
|
+
if @estimator.is_a?(SVMKit::Base::Regressor)
|
75
|
+
SVMKit::Validation.check_tvalue_array(y)
|
76
|
+
SVMKit::Validation.check_sample_tvalue_size(x, y)
|
77
|
+
end
|
66
78
|
# Initialize the report of cross validation.
|
67
79
|
report = { test_score: [], train_score: nil, fit_time: [] }
|
68
80
|
report[:train_score] = [] if @return_train_score
|
@@ -71,9 +83,9 @@ module SVMKit
|
|
71
83
|
# Split dataset into training and testing dataset.
|
72
84
|
feature_ids = !kernel_machine? || train_ids
|
73
85
|
train_x = x[train_ids, feature_ids]
|
74
|
-
train_y = y[train_ids]
|
86
|
+
train_y = y.shape[1].nil? ? y[train_ids] : y[train_ids, true]
|
75
87
|
test_x = x[test_ids, feature_ids]
|
76
|
-
test_y = y[test_ids]
|
88
|
+
test_y = y.shape[1].nil? ? y[test_ids] : y[test_ids, true]
|
77
89
|
# Fit the estimator.
|
78
90
|
start_time = Time.now.to_i
|
79
91
|
@estimator.fit(train_x, train_y)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'svmkit/validation'
|
4
|
+
require 'svmkit/base/base_estimator'
|
5
|
+
require 'svmkit/base/regressor'
|
6
|
+
|
7
|
+
module SVMKit
|
8
|
+
module NearestNeighbors
|
9
|
+
# KNeighborsRegressor is a class that implements the regressor with the k-nearest neighbors rule.
|
10
|
+
# The current implementation uses the Euclidean distance for finding the neighbors.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# estimator =
|
14
|
+
# SVMKit::NearestNeighbor::KNeighborsRegressor.new(n_neighbors = 5)
|
15
|
+
# estimator.fit(training_samples, traininig_target_values)
|
16
|
+
# results = estimator.predict(testing_samples)
|
17
|
+
#
|
18
|
+
class KNeighborsRegressor
|
19
|
+
include Base::BaseEstimator
|
20
|
+
include Base::Regressor
|
21
|
+
|
22
|
+
# Return the prototypes for the nearest neighbor regressor.
|
23
|
+
# @return [Numo::DFloat] (shape: [n_samples, n_features])
|
24
|
+
attr_reader :prototypes
|
25
|
+
|
26
|
+
# Return the values of the prototypes
|
27
|
+
# @return [Numo::DFloat] (shape: [n_samples, n_outputs])
|
28
|
+
attr_reader :values
|
29
|
+
|
30
|
+
# Create a new regressor with the nearest neighbor rule.
|
31
|
+
#
|
32
|
+
# @param n_neighbors [Integer] The number of neighbors.
|
33
|
+
def initialize(n_neighbors: 5)
|
34
|
+
SVMKit::Validation.check_params_integer(n_neighbors: n_neighbors)
|
35
|
+
SVMKit::Validation.check_params_positive(n_neighbors: n_neighbors)
|
36
|
+
@params = {}
|
37
|
+
@params[:n_neighbors] = n_neighbors
|
38
|
+
@prototypes = nil
|
39
|
+
@values = nil
|
40
|
+
end
|
41
|
+
|
42
|
+
# Fit the model with given training data.
|
43
|
+
#
|
44
|
+
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The training data to be used for fitting the model.
|
45
|
+
# @param y [Numo::DFloat] (shape: [n_samples, n_outputs]) The target values to be used for fitting the model.
|
46
|
+
# @return [KNeighborsRegressor] The learned regressor itself.
|
47
|
+
def fit(x, y)
|
48
|
+
SVMKit::Validation.check_sample_array(x)
|
49
|
+
SVMKit::Validation.check_tvalue_array(y)
|
50
|
+
SVMKit::Validation.check_sample_tvalue_size(x, y)
|
51
|
+
@prototypes = x.dup
|
52
|
+
@values = y.dup
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
# Predict values for samples.
|
57
|
+
#
|
58
|
+
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the values.
|
59
|
+
# @return [Numo::DFloat] (shape: [n_samples, n_outputs]) Predicted values per sample.
|
60
|
+
def predict(x)
|
61
|
+
SVMKit::Validation.check_sample_array(x)
|
62
|
+
# Initialize some variables.
|
63
|
+
n_samples, = x.shape
|
64
|
+
n_prototypes, n_outputs = @values.shape
|
65
|
+
n_neighbors = [@params[:n_neighbors], n_prototypes].min
|
66
|
+
# Calculate distance matrix.
|
67
|
+
distance_matrix = PairwiseMetric.euclidean_distance(x, @prototypes)
|
68
|
+
# Predict values for the given samples.
|
69
|
+
predicted_values = Array.new(n_samples) do |n|
|
70
|
+
neighbor_ids = distance_matrix[n, true].to_a.each_with_index.sort.map(&:last)[0...n_neighbors]
|
71
|
+
n_outputs.nil? ? @values[neighbor_ids].mean : @values[neighbor_ids, true].mean(0).to_a
|
72
|
+
end
|
73
|
+
Numo::DFloat[*predicted_values]
|
74
|
+
end
|
75
|
+
|
76
|
+
# Dump marshal data.
|
77
|
+
# @return [Hash] The marshal data about KNeighborsRegressor.
|
78
|
+
def marshal_dump
|
79
|
+
{ params: @params,
|
80
|
+
prototypes: @prototypes,
|
81
|
+
values: @values }
|
82
|
+
end
|
83
|
+
|
84
|
+
# Load marshal data.
|
85
|
+
# @return [nil]
|
86
|
+
def marshal_load(obj)
|
87
|
+
@params = obj[:params]
|
88
|
+
@prototypes = obj[:prototypes]
|
89
|
+
@values = obj[:values]
|
90
|
+
nil
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'svmkit/validation'
|
3
4
|
require 'svmkit/base/base_estimator'
|
4
5
|
require 'svmkit/base/classifier'
|
5
6
|
|
@@ -110,7 +111,7 @@ module SVMKit
|
|
110
111
|
@bias_term[n] = bias
|
111
112
|
end
|
112
113
|
else
|
113
|
-
negative_label = y.to_a.uniq.
|
114
|
+
negative_label = y.to_a.uniq.min
|
114
115
|
bin_y = Numo::Int32.cast(y.ne(negative_label)) * 2 - 1
|
115
116
|
@factor_mat, @weight_vec, @bias_term = binary_fit(x, bin_y)
|
116
117
|
end
|
@@ -27,7 +27,7 @@ module SVMKit
|
|
27
27
|
def fit_sigmoid(df, bin_y, max_iter = 100, min_step = 1e-10, sigma = 1e-12)
|
28
28
|
# Initialize some variables.
|
29
29
|
n_samples = bin_y.size
|
30
|
-
negative_label = bin_y.to_a.uniq.
|
30
|
+
negative_label = bin_y.to_a.uniq.min
|
31
31
|
pos = bin_y.ne(negative_label)
|
32
32
|
neg = bin_y.eq(negative_label)
|
33
33
|
n_pos_samples = pos.count
|
data/lib/svmkit/validation.rb
CHANGED
@@ -19,12 +19,24 @@ module SVMKit
|
|
19
19
|
nil
|
20
20
|
end
|
21
21
|
|
22
|
+
# @!visibility private
|
23
|
+
def check_tvalue_array(y)
|
24
|
+
raise TypeError, 'Expect class of target value vector to be Numo::DFloat' unless y.is_a?(Numo::DFloat)
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
22
28
|
# @!visibility private
|
23
29
|
def check_sample_label_size(x, y)
|
24
30
|
raise ArgumentError, 'Expect to have the same number of samples for sample matrix and label vector' unless x.shape[0] == y.shape[0]
|
25
31
|
nil
|
26
32
|
end
|
27
33
|
|
34
|
+
# @!visibility private
|
35
|
+
def check_sample_tvalue_size(x, y)
|
36
|
+
raise ArgumentError, 'Expect to have the same number of samples for sample matrix and target value vector' unless x.shape[0] == y.shape[0]
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
|
28
40
|
# @!visibility private
|
29
41
|
def check_params_type(type, params = {})
|
30
42
|
params.each { |k, v| raise TypeError, "Expect class of #{k} to be #{type}" unless v.is_a?(type) }
|
data/lib/svmkit/version.rb
CHANGED
data/lib/svmkit.rb
CHANGED
@@ -9,16 +9,19 @@ require 'svmkit/dataset'
|
|
9
9
|
require 'svmkit/probabilistic_output'
|
10
10
|
require 'svmkit/base/base_estimator'
|
11
11
|
require 'svmkit/base/classifier'
|
12
|
+
require 'svmkit/base/regressor'
|
12
13
|
require 'svmkit/base/transformer'
|
13
14
|
require 'svmkit/base/splitter'
|
14
15
|
require 'svmkit/base/evaluator'
|
15
16
|
require 'svmkit/kernel_approximation/rbf'
|
16
17
|
require 'svmkit/linear_model/svc'
|
18
|
+
require 'svmkit/linear_model/svr'
|
17
19
|
require 'svmkit/linear_model/logistic_regression'
|
18
20
|
require 'svmkit/kernel_machine/kernel_svc'
|
19
21
|
require 'svmkit/polynomial_model/factorization_machine_classifier'
|
20
22
|
require 'svmkit/multiclass/one_vs_rest_classifier'
|
21
23
|
require 'svmkit/nearest_neighbors/k_neighbors_classifier'
|
24
|
+
require 'svmkit/nearest_neighbors/k_neighbors_regressor'
|
22
25
|
require 'svmkit/naive_bayes/naive_bayes'
|
23
26
|
require 'svmkit/tree/decision_tree_classifier'
|
24
27
|
require 'svmkit/ensemble/random_forest_classifier'
|
@@ -35,3 +38,6 @@ require 'svmkit/evaluation_measure/precision'
|
|
35
38
|
require 'svmkit/evaluation_measure/recall'
|
36
39
|
require 'svmkit/evaluation_measure/f_score'
|
37
40
|
require 'svmkit/evaluation_measure/log_loss'
|
41
|
+
require 'svmkit/evaluation_measure/r2_score'
|
42
|
+
require 'svmkit/evaluation_measure/mean_squared_error'
|
43
|
+
require 'svmkit/evaluation_measure/mean_absolute_error'
|
data/svmkit.gemspec
CHANGED
@@ -18,7 +18,7 @@ SVMKit is a machine learninig library in Ruby.
|
|
18
18
|
SVMKit provides machine learning algorithms with interfaces similar to Scikit-Learn in Python.
|
19
19
|
SVMKit currently supports Linear / Kernel Support Vector Machine,
|
20
20
|
Logistic Regression, Factorization Machine, Naive Bayes, Decision Tree, Random Forest,
|
21
|
-
K-nearest neighbor
|
21
|
+
K-nearest neighbor algorithm, and cross-validation.
|
22
22
|
MSG
|
23
23
|
spec.homepage = 'https://github.com/yoshoku/svmkit'
|
24
24
|
spec.license = 'BSD-2-Clause'
|
@@ -38,13 +38,4 @@ MSG
|
|
38
38
|
spec.add_development_dependency 'coveralls', '~> 0.8'
|
39
39
|
spec.add_development_dependency 'rake', '~> 12.0'
|
40
40
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
41
|
-
|
42
|
-
spec.post_install_message = <<MSG
|
43
|
-
*************************************************************************
|
44
|
-
Thank you for installing SVMKit!!
|
45
|
-
|
46
|
-
Note that the SVMKit has been changed to use Numo::NArray for
|
47
|
-
linear algebra library from version 0.2.0.
|
48
|
-
*************************************************************************
|
49
|
-
MSG
|
50
41
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: svmkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|
@@ -85,7 +85,7 @@ description: |
|
|
85
85
|
SVMKit provides machine learning algorithms with interfaces similar to Scikit-Learn in Python.
|
86
86
|
SVMKit currently supports Linear / Kernel Support Vector Machine,
|
87
87
|
Logistic Regression, Factorization Machine, Naive Bayes, Decision Tree, Random Forest,
|
88
|
-
K-nearest neighbor
|
88
|
+
K-nearest neighbor algorithm, and cross-validation.
|
89
89
|
email:
|
90
90
|
- yoshoku@outlook.com
|
91
91
|
executables: []
|
@@ -110,6 +110,7 @@ files:
|
|
110
110
|
- lib/svmkit/base/base_estimator.rb
|
111
111
|
- lib/svmkit/base/classifier.rb
|
112
112
|
- lib/svmkit/base/evaluator.rb
|
113
|
+
- lib/svmkit/base/regressor.rb
|
113
114
|
- lib/svmkit/base/splitter.rb
|
114
115
|
- lib/svmkit/base/transformer.rb
|
115
116
|
- lib/svmkit/dataset.rb
|
@@ -117,19 +118,24 @@ files:
|
|
117
118
|
- lib/svmkit/evaluation_measure/accuracy.rb
|
118
119
|
- lib/svmkit/evaluation_measure/f_score.rb
|
119
120
|
- lib/svmkit/evaluation_measure/log_loss.rb
|
121
|
+
- lib/svmkit/evaluation_measure/mean_absolute_error.rb
|
122
|
+
- lib/svmkit/evaluation_measure/mean_squared_error.rb
|
120
123
|
- lib/svmkit/evaluation_measure/precision.rb
|
121
124
|
- lib/svmkit/evaluation_measure/precision_recall.rb
|
125
|
+
- lib/svmkit/evaluation_measure/r2_score.rb
|
122
126
|
- lib/svmkit/evaluation_measure/recall.rb
|
123
127
|
- lib/svmkit/kernel_approximation/rbf.rb
|
124
128
|
- lib/svmkit/kernel_machine/kernel_svc.rb
|
125
129
|
- lib/svmkit/linear_model/logistic_regression.rb
|
126
130
|
- lib/svmkit/linear_model/svc.rb
|
131
|
+
- lib/svmkit/linear_model/svr.rb
|
127
132
|
- lib/svmkit/model_selection/cross_validation.rb
|
128
133
|
- lib/svmkit/model_selection/k_fold.rb
|
129
134
|
- lib/svmkit/model_selection/stratified_k_fold.rb
|
130
135
|
- lib/svmkit/multiclass/one_vs_rest_classifier.rb
|
131
136
|
- lib/svmkit/naive_bayes/naive_bayes.rb
|
132
137
|
- lib/svmkit/nearest_neighbors/k_neighbors_classifier.rb
|
138
|
+
- lib/svmkit/nearest_neighbors/k_neighbors_regressor.rb
|
133
139
|
- lib/svmkit/pairwise_metric.rb
|
134
140
|
- lib/svmkit/polynomial_model/factorization_machine_classifier.rb
|
135
141
|
- lib/svmkit/preprocessing/l2_normalizer.rb
|
@@ -146,13 +152,7 @@ homepage: https://github.com/yoshoku/svmkit
|
|
146
152
|
licenses:
|
147
153
|
- BSD-2-Clause
|
148
154
|
metadata: {}
|
149
|
-
post_install_message:
|
150
|
-
*************************************************************************
|
151
|
-
Thank you for installing SVMKit!!
|
152
|
-
|
153
|
-
Note that the SVMKit has been changed to use Numo::NArray for
|
154
|
-
linear algebra library from version 0.2.0.
|
155
|
-
*************************************************************************
|
155
|
+
post_install_message:
|
156
156
|
rdoc_options: []
|
157
157
|
require_paths:
|
158
158
|
- lib
|