svmkit 0.7.3 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -9
- data/.rspec +1 -0
- data/.travis.yml +4 -12
- data/LICENSE.txt +1 -1
- data/README.md +11 -13
- data/lib/svmkit.rb +3 -66
- data/svmkit.gemspec +12 -7
- metadata +16 -81
- data/.coveralls.yml +0 -1
- data/.rubocop.yml +0 -47
- data/.rubocop_todo.yml +0 -58
- data/HISTORY.md +0 -168
- data/lib/svmkit/base/base_estimator.rb +0 -13
- data/lib/svmkit/base/classifier.rb +0 -34
- data/lib/svmkit/base/cluster_analyzer.rb +0 -29
- data/lib/svmkit/base/evaluator.rb +0 -13
- data/lib/svmkit/base/regressor.rb +0 -34
- data/lib/svmkit/base/splitter.rb +0 -17
- data/lib/svmkit/base/transformer.rb +0 -18
- data/lib/svmkit/clustering/dbscan.rb +0 -127
- data/lib/svmkit/clustering/k_means.rb +0 -140
- data/lib/svmkit/dataset.rb +0 -109
- data/lib/svmkit/decomposition/nmf.rb +0 -147
- data/lib/svmkit/decomposition/pca.rb +0 -150
- data/lib/svmkit/ensemble/ada_boost_classifier.rb +0 -198
- data/lib/svmkit/ensemble/ada_boost_regressor.rb +0 -180
- data/lib/svmkit/ensemble/random_forest_classifier.rb +0 -182
- data/lib/svmkit/ensemble/random_forest_regressor.rb +0 -143
- data/lib/svmkit/evaluation_measure/accuracy.rb +0 -30
- data/lib/svmkit/evaluation_measure/f_score.rb +0 -51
- data/lib/svmkit/evaluation_measure/log_loss.rb +0 -46
- data/lib/svmkit/evaluation_measure/mean_absolute_error.rb +0 -30
- data/lib/svmkit/evaluation_measure/mean_squared_error.rb +0 -30
- data/lib/svmkit/evaluation_measure/normalized_mutual_information.rb +0 -63
- data/lib/svmkit/evaluation_measure/precision.rb +0 -51
- data/lib/svmkit/evaluation_measure/precision_recall.rb +0 -91
- data/lib/svmkit/evaluation_measure/purity.rb +0 -41
- data/lib/svmkit/evaluation_measure/r2_score.rb +0 -44
- data/lib/svmkit/evaluation_measure/recall.rb +0 -51
- data/lib/svmkit/kernel_approximation/rbf.rb +0 -136
- data/lib/svmkit/kernel_machine/kernel_svc.rb +0 -194
- data/lib/svmkit/linear_model/lasso.rb +0 -138
- data/lib/svmkit/linear_model/linear_regression.rb +0 -112
- data/lib/svmkit/linear_model/logistic_regression.rb +0 -161
- data/lib/svmkit/linear_model/ridge.rb +0 -112
- data/lib/svmkit/linear_model/sgd_linear_estimator.rb +0 -89
- data/lib/svmkit/linear_model/svc.rb +0 -184
- data/lib/svmkit/linear_model/svr.rb +0 -123
- data/lib/svmkit/model_selection/cross_validation.rb +0 -121
- data/lib/svmkit/model_selection/grid_search_cv.rb +0 -247
- data/lib/svmkit/model_selection/k_fold.rb +0 -77
- data/lib/svmkit/model_selection/stratified_k_fold.rb +0 -95
- data/lib/svmkit/multiclass/one_vs_rest_classifier.rb +0 -101
- data/lib/svmkit/naive_bayes/naive_bayes.rb +0 -316
- data/lib/svmkit/nearest_neighbors/k_neighbors_classifier.rb +0 -112
- data/lib/svmkit/nearest_neighbors/k_neighbors_regressor.rb +0 -94
- data/lib/svmkit/optimizer/nadam.rb +0 -90
- data/lib/svmkit/optimizer/rmsprop.rb +0 -69
- data/lib/svmkit/optimizer/sgd.rb +0 -65
- data/lib/svmkit/optimizer/yellow_fin.rb +0 -144
- data/lib/svmkit/pairwise_metric.rb +0 -91
- data/lib/svmkit/pipeline/pipeline.rb +0 -197
- data/lib/svmkit/polynomial_model/factorization_machine_classifier.rb +0 -262
- data/lib/svmkit/polynomial_model/factorization_machine_regressor.rb +0 -194
- data/lib/svmkit/preprocessing/l2_normalizer.rb +0 -63
- data/lib/svmkit/preprocessing/label_encoder.rb +0 -95
- data/lib/svmkit/preprocessing/min_max_scaler.rb +0 -93
- data/lib/svmkit/preprocessing/one_hot_encoder.rb +0 -99
- data/lib/svmkit/preprocessing/standard_scaler.rb +0 -87
- data/lib/svmkit/probabilistic_output.rb +0 -112
- data/lib/svmkit/tree/decision_tree_classifier.rb +0 -276
- data/lib/svmkit/tree/decision_tree_regressor.rb +0 -251
- data/lib/svmkit/tree/node.rb +0 -70
- data/lib/svmkit/utils.rb +0 -22
- data/lib/svmkit/validation.rb +0 -79
- data/lib/svmkit/values.rb +0 -13
- data/lib/svmkit/version.rb +0 -7
@@ -1,90 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'svmkit/validation'
|
4
|
-
require 'svmkit/base/base_estimator'
|
5
|
-
|
6
|
-
module SVMKit
|
7
|
-
# This module consists of the classes that implement optimizers adaptively tuning hyperparameters.
|
8
|
-
module Optimizer
|
9
|
-
# Nadam is a class that implements Nadam optimizer.
|
10
|
-
#
|
11
|
-
# @example
|
12
|
-
# optimizer = SVMKit::Optimizer::Nadam.new(learning_rate: 0.01, momentum: 0.9, decay1: 0.9, decay2: 0.999)
|
13
|
-
# estimator = SVMKit::LinearModel::LinearRegression.new(optimizer: optimizer, random_seed: 1)
|
14
|
-
# estimator.fit(samples, values)
|
15
|
-
#
|
16
|
-
# *Reference*
|
17
|
-
# - T. Dozat, "Incorporating Nesterov Momentum into Adam," Tech. Repo. Stanford University, 2015.
|
18
|
-
class Nadam
|
19
|
-
include Base::BaseEstimator
|
20
|
-
include Validation
|
21
|
-
|
22
|
-
# Create a new optimizer with Nadam
|
23
|
-
#
|
24
|
-
# @param learning_rate [Float] The initial value of learning rate.
|
25
|
-
# @param momentum [Float] The initial value of momentum.
|
26
|
-
# @param decay1 [Float] The smoothing parameter for the first moment.
|
27
|
-
# @param decay2 [Float] The smoothing parameter for the second moment.
|
28
|
-
def initialize(learning_rate: 0.01, momentum: 0.9, decay1: 0.9, decay2: 0.999)
|
29
|
-
check_params_float(learning_rate: learning_rate, momentum: momentum, decay1: decay1, decay2: decay2)
|
30
|
-
check_params_positive(learning_rate: learning_rate, momentum: momentum, decay1: decay1, decay2: decay2)
|
31
|
-
@params = {}
|
32
|
-
@params[:learning_rate] = learning_rate
|
33
|
-
@params[:momentum] = momentum
|
34
|
-
@params[:decay1] = decay1
|
35
|
-
@params[:decay2] = decay2
|
36
|
-
@fst_moment = nil
|
37
|
-
@sec_moment = nil
|
38
|
-
@decay1_prod = 1.0
|
39
|
-
@iter = 0
|
40
|
-
end
|
41
|
-
|
42
|
-
# Calculate the updated weight with Nadam adaptive learning rate.
|
43
|
-
#
|
44
|
-
# @param weight [Numo::DFloat] (shape: [n_features]) The weight to be updated.
|
45
|
-
# @param gradient [Numo::DFloat] (shape: [n_features]) The gradient for updating the weight.
|
46
|
-
# @return [Numo::DFloat] (shape: [n_feautres]) The updated weight.
|
47
|
-
def call(weight, gradient)
|
48
|
-
@fst_moment ||= Numo::DFloat.zeros(weight.shape[0])
|
49
|
-
@sec_moment ||= Numo::DFloat.zeros(weight.shape[0])
|
50
|
-
|
51
|
-
@iter += 1
|
52
|
-
|
53
|
-
decay1_curr = @params[:decay1] * (1.0 - 0.5 * 0.96**(@iter * 0.004))
|
54
|
-
decay1_next = @params[:decay1] * (1.0 - 0.5 * 0.96**((@iter + 1) * 0.004))
|
55
|
-
decay1_prod_curr = @decay1_prod * decay1_curr
|
56
|
-
decay1_prod_next = @decay1_prod * decay1_curr * decay1_next
|
57
|
-
@decay1_prod = decay1_prod_curr
|
58
|
-
|
59
|
-
@fst_moment = @params[:decay1] * @fst_moment + (1.0 - @params[:decay1]) * gradient
|
60
|
-
@sec_moment = @params[:decay2] * @sec_moment + (1.0 - @params[:decay2]) * gradient**2
|
61
|
-
nm_gradient = gradient / (1.0 - decay1_prod_curr)
|
62
|
-
nm_fst_moment = @fst_moment / (1.0 - decay1_prod_next)
|
63
|
-
nm_sec_moment = @sec_moment / (1.0 - @params[:decay2]**@iter)
|
64
|
-
|
65
|
-
weight - (@params[:learning_rate] / (nm_sec_moment**0.5 + 1e-8)) * ((1 - decay1_curr) * nm_gradient + decay1_next * nm_fst_moment)
|
66
|
-
end
|
67
|
-
|
68
|
-
# Dump marshal data.
|
69
|
-
# @return [Hash] The marshal data.
|
70
|
-
def marshal_dump
|
71
|
-
{ params: @params,
|
72
|
-
fst_moment: @fst_moment,
|
73
|
-
sec_moment: @sec_moment,
|
74
|
-
decay1_prod: @decay1_prod,
|
75
|
-
iter: @iter }
|
76
|
-
end
|
77
|
-
|
78
|
-
# Load marshal data.
|
79
|
-
# @return [nil]
|
80
|
-
def marshal_load(obj)
|
81
|
-
@params = obj[:params]
|
82
|
-
@fst_moment = obj[:fst_moment]
|
83
|
-
@sec_moment = obj[:sec_moment]
|
84
|
-
@decay1_prod = obj[:decay1_prod]
|
85
|
-
@iter = obj[:iter]
|
86
|
-
nil
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'svmkit/validation'
|
4
|
-
require 'svmkit/base/base_estimator'
|
5
|
-
|
6
|
-
module SVMKit
|
7
|
-
module Optimizer
|
8
|
-
# RMSProp is a class that implements RMSProp optimizer.
|
9
|
-
#
|
10
|
-
# @example
|
11
|
-
# optimizer = SVMKit::Optimizer::RMSProp.new(learning_rate: 0.01, momentum: 0.9, decay: 0.9)
|
12
|
-
# estimator = SVMKit::LinearModel::LinearRegression.new(optimizer: optimizer, random_seed: 1)
|
13
|
-
# estimator.fit(samples, values)
|
14
|
-
#
|
15
|
-
# *Reference*
|
16
|
-
# - I. Sutskever, J. Martens, G. Dahl, and G. Hinton, "On the importance of initialization and momentum in deep learning," Proc. ICML' 13, pp. 1139--1147, 2013.
|
17
|
-
# - G. Hinton, N. Srivastava, and K. Swersky, "Lecture 6e rmsprop," Neural Networks for Machine Learning, 2012.
|
18
|
-
class RMSProp
|
19
|
-
include Base::BaseEstimator
|
20
|
-
include Validation
|
21
|
-
|
22
|
-
# Create a new optimizer with RMSProp.
|
23
|
-
#
|
24
|
-
# @param learning_rate [Float] The initial value of learning rate.
|
25
|
-
# @param momentum [Float] The initial value of momentum.
|
26
|
-
# @param decay [Float] The smooting parameter.
|
27
|
-
def initialize(learning_rate: 0.01, momentum: 0.9, decay: 0.9)
|
28
|
-
check_params_float(learning_rate: learning_rate, momentum: momentum, decay: decay)
|
29
|
-
check_params_positive(learning_rate: learning_rate, momentum: momentum, decay: decay)
|
30
|
-
@params = {}
|
31
|
-
@params[:learning_rate] = learning_rate
|
32
|
-
@params[:momentum] = momentum
|
33
|
-
@params[:decay] = decay
|
34
|
-
@moment = nil
|
35
|
-
@update = nil
|
36
|
-
end
|
37
|
-
|
38
|
-
# Calculate the updated weight with RMSProp adaptive learning rate.
|
39
|
-
#
|
40
|
-
# @param weight [Numo::DFloat] (shape: [n_features]) The weight to be updated.
|
41
|
-
# @param gradient [Numo::DFloat] (shape: [n_features]) The gradient for updating the weight.
|
42
|
-
# @return [Numo::DFloat] (shape: [n_feautres]) The updated weight.
|
43
|
-
def call(weight, gradient)
|
44
|
-
@moment ||= Numo::DFloat.zeros(weight.shape[0])
|
45
|
-
@update ||= Numo::DFloat.zeros(weight.shape[0])
|
46
|
-
@moment = @params[:decay] * @moment + (1.0 - @params[:decay]) * gradient**2
|
47
|
-
@update = @params[:momentum] * @update - (@params[:learning_rate] / (@moment**0.5 + 1.0e-8)) * gradient
|
48
|
-
weight + @update
|
49
|
-
end
|
50
|
-
|
51
|
-
# Dump marshal data.
|
52
|
-
# @return [Hash] The marshal data.
|
53
|
-
def marshal_dump
|
54
|
-
{ params: @params,
|
55
|
-
moment: @moment,
|
56
|
-
update: @update }
|
57
|
-
end
|
58
|
-
|
59
|
-
# Load marshal data.
|
60
|
-
# @return [nil]
|
61
|
-
def marshal_load(obj)
|
62
|
-
@params = obj[:params]
|
63
|
-
@moment = obj[:moment]
|
64
|
-
@update = obj[:update]
|
65
|
-
nil
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
data/lib/svmkit/optimizer/sgd.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'svmkit/validation'
|
4
|
-
require 'svmkit/base/base_estimator'
|
5
|
-
|
6
|
-
module SVMKit
|
7
|
-
module Optimizer
|
8
|
-
# SGD is a class that implements SGD optimizer.
|
9
|
-
#
|
10
|
-
# @example
|
11
|
-
# optimizer = SVMKit::Optimizer::SGD.new(learning_rate: 0.01, momentum: 0.9, decay: 0.9)
|
12
|
-
# estimator = SVMKit::LinearModel::LinearRegression.new(optimizer: optimizer, random_seed: 1)
|
13
|
-
# estimator.fit(samples, values)
|
14
|
-
class SGD
|
15
|
-
include Base::BaseEstimator
|
16
|
-
include Validation
|
17
|
-
|
18
|
-
# Create a new optimizer with SGD.
|
19
|
-
#
|
20
|
-
# @param learning_rate [Float] The initial value of learning rate.
|
21
|
-
# @param momentum [Float] The initial value of momentum.
|
22
|
-
# @param decay [Float] The smooting parameter.
|
23
|
-
def initialize(learning_rate: 0.01, momentum: 0.0, decay: 0.0)
|
24
|
-
check_params_float(learning_rate: learning_rate, momentum: momentum, decay: decay)
|
25
|
-
check_params_positive(learning_rate: learning_rate, momentum: momentum, decay: decay)
|
26
|
-
@params = {}
|
27
|
-
@params[:learning_rate] = learning_rate
|
28
|
-
@params[:momentum] = momentum
|
29
|
-
@params[:decay] = decay
|
30
|
-
@iter = 0
|
31
|
-
@update = nil
|
32
|
-
end
|
33
|
-
|
34
|
-
# Calculate the updated weight with SGD.
|
35
|
-
#
|
36
|
-
# @param weight [Numo::DFloat] (shape: [n_features]) The weight to be updated.
|
37
|
-
# @param gradient [Numo::DFloat] (shape: [n_features]) The gradient for updating the weight.
|
38
|
-
# @return [Numo::DFloat] (shape: [n_feautres]) The updated weight.
|
39
|
-
def call(weight, gradient)
|
40
|
-
@update ||= Numo::DFloat.zeros(weight.shape[0])
|
41
|
-
current_learning_rate = @params[:learning_rate] / (1.0 + @params[:decay] * @iter)
|
42
|
-
@iter += 1
|
43
|
-
@update = @params[:momentum] * @update - current_learning_rate * gradient
|
44
|
-
weight + @update
|
45
|
-
end
|
46
|
-
|
47
|
-
# Dump marshal data.
|
48
|
-
# @return [Hash] The marshal data.
|
49
|
-
def marshal_dump
|
50
|
-
{ params: @params,
|
51
|
-
iter: @iter,
|
52
|
-
update: @update }
|
53
|
-
end
|
54
|
-
|
55
|
-
# Load marshal data.
|
56
|
-
# @return [nil]
|
57
|
-
def marshal_load(obj)
|
58
|
-
@params = obj[:params]
|
59
|
-
@iter = obj[:iter]
|
60
|
-
@update = obj[:update]
|
61
|
-
nil
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,144 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'svmkit/validation'
|
4
|
-
require 'svmkit/base/base_estimator'
|
5
|
-
|
6
|
-
module SVMKit
|
7
|
-
module Optimizer
|
8
|
-
# YellowFin is a class that implements YellowFin optimizer.
|
9
|
-
#
|
10
|
-
# @example
|
11
|
-
# optimizer = SVMKit::Optimizer::YellowFin.new(learning_rate: 0.01, momentum: 0.9, decay: 0.999, window_width: 20)
|
12
|
-
# estimator = SVMKit::LinearModel::LinearRegression.new(optimizer: optimizer, random_seed: 1)
|
13
|
-
# estimator.fit(samples, values)
|
14
|
-
#
|
15
|
-
# *Reference*
|
16
|
-
# - J. Zhang and I. Mitliagkas, "YellowFin and the Art of Momentum Tuning," CoRR abs/1706.03471, 2017.
|
17
|
-
class YellowFin
|
18
|
-
include Base::BaseEstimator
|
19
|
-
include Validation
|
20
|
-
|
21
|
-
# Create a new optimizer with YellowFin.
|
22
|
-
#
|
23
|
-
# @param learning_rate [Float] The initial value of learning rate.
|
24
|
-
# @param momentum [Float] The initial value of momentum.
|
25
|
-
# @param decay [Float] The smooting parameter.
|
26
|
-
# @param window_width [Integer] The sliding window width for searching curvature range.
|
27
|
-
def initialize(learning_rate: 0.01, momentum: 0.9, decay: 0.999, window_width: 20)
|
28
|
-
check_params_float(learning_rate: learning_rate, momentum: momentum, decay: decay)
|
29
|
-
check_params_integer(window_width: window_width)
|
30
|
-
check_params_positive(learning_rate: learning_rate, momentum: momentum, decay: decay, window_width: window_width)
|
31
|
-
@params = {}
|
32
|
-
@params[:learning_rate] = learning_rate
|
33
|
-
@params[:momentum] = momentum
|
34
|
-
@params[:decay] = decay
|
35
|
-
@params[:window_width] = window_width
|
36
|
-
@smth_learning_rate = learning_rate
|
37
|
-
@smth_momentum = momentum
|
38
|
-
@grad_norms = nil
|
39
|
-
@grad_norm_min = 0.0
|
40
|
-
@grad_norm_max = 0.0
|
41
|
-
@grad_mean_sqr = 0.0
|
42
|
-
@grad_mean = 0.0
|
43
|
-
@grad_var = 0.0
|
44
|
-
@grad_norm_mean = 0.0
|
45
|
-
@curve_mean = 0.0
|
46
|
-
@distance_mean = 0.0
|
47
|
-
@update = nil
|
48
|
-
end
|
49
|
-
|
50
|
-
# Calculate the updated weight with adaptive momentum coefficient and learning rate.
|
51
|
-
#
|
52
|
-
# @param weight [Numo::DFloat] (shape: [n_features]) The weight to be updated.
|
53
|
-
# @param gradient [Numo::DFloat] (shape: [n_features]) The gradient for updating the weight.
|
54
|
-
# @return [Numo::DFloat] (shape: [n_feautres]) The updated weight.
|
55
|
-
def call(weight, gradient)
|
56
|
-
@update ||= Numo::DFloat.zeros(weight.shape[0])
|
57
|
-
curvature_range(gradient)
|
58
|
-
gradient_variance(gradient)
|
59
|
-
distance_to_optimum(gradient)
|
60
|
-
@smth_momentum = @params[:decay] * @smth_momentum + (1 - @params[:decay]) * current_momentum
|
61
|
-
@smth_learning_rate = @params[:decay] * @smth_learning_rate + (1 - @params[:decay]) * current_learning_rate
|
62
|
-
@update = @smth_momentum * @update - @smth_learning_rate * gradient
|
63
|
-
weight + @update
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def current_momentum
|
69
|
-
dr = Math.sqrt(@grad_norm_max / @grad_norm_min + 1.0e-8)
|
70
|
-
[cubic_root**2, ((dr - 1) / (dr + 1))**2].max
|
71
|
-
end
|
72
|
-
|
73
|
-
def current_learning_rate
|
74
|
-
(1.0 - Math.sqrt(@params[:momentum]))**2 / (@grad_norm_min + 1.0e-8)
|
75
|
-
end
|
76
|
-
|
77
|
-
def cubic_root
|
78
|
-
p = (@distance_mean**2 * @grad_norm_min**2) / (2 * @grad_var + 1.0e-8)
|
79
|
-
w3 = (-Math.sqrt(p**2 + 4.fdiv(27) * p**3) - p).fdiv(2)
|
80
|
-
w = (w3 >= 0.0 ? 1 : -1) * w3.abs**1.fdiv(3)
|
81
|
-
y = w - p / (3 * w + 1.0e-8)
|
82
|
-
y + 1
|
83
|
-
end
|
84
|
-
|
85
|
-
def curvature_range(gradient)
|
86
|
-
@grad_norms ||= []
|
87
|
-
@grad_norms.push((gradient**2).sum)
|
88
|
-
@grad_norms.shift(@grad_norms.size - @params[:window_width]) if @grad_norms.size > @params[:window_width]
|
89
|
-
@grad_norm_min = @params[:decay] * @grad_norm_min + (1 - @params[:decay]) * @grad_norms.min
|
90
|
-
@grad_norm_max = @params[:decay] * @grad_norm_max + (1 - @params[:decay]) * @grad_norms.max
|
91
|
-
end
|
92
|
-
|
93
|
-
def gradient_variance(gradient)
|
94
|
-
@grad_mean_sqr = @params[:decay] * @grad_mean_sqr + (1 - @params[:decay]) * gradient**2
|
95
|
-
@grad_mean = @params[:decay] * @grad_mean + (1 - @params[:decay]) * gradient
|
96
|
-
@grad_var = (@grad_mean_sqr - @grad_mean**2).sum
|
97
|
-
end
|
98
|
-
|
99
|
-
def distance_to_optimum(gradient)
|
100
|
-
grad_sqr = (gradient**2).sum
|
101
|
-
@grad_norm_mean = @params[:decay] * @grad_norm_mean + (1 - @params[:decay]) * Math.sqrt(grad_sqr + 1.0e-8)
|
102
|
-
@curve_mean = @params[:decay] * @curve_mean + (1 - @params[:decay]) * grad_sqr
|
103
|
-
@distance_mean = @params[:decay] * @distance_mean + (1 - @params[:decay]) * (@grad_norm_mean / @curve_mean)
|
104
|
-
end
|
105
|
-
|
106
|
-
# Dump marshal data.
|
107
|
-
# @return [Hash] The marshal data.
|
108
|
-
def marshal_dump
|
109
|
-
{ params: @params,
|
110
|
-
smth_learning_rate: @smth_learning_rate,
|
111
|
-
smth_momentum: @smth_momentum,
|
112
|
-
grad_norms: @grad_norms,
|
113
|
-
grad_norm_min: @grad_norm_min,
|
114
|
-
grad_norm_max: @grad_norm_max,
|
115
|
-
grad_mean_sqr: @grad_mean_sqr,
|
116
|
-
grad_mean: @grad_mean,
|
117
|
-
grad_var: @grad_var,
|
118
|
-
grad_norm_mean: @grad_norm_mean,
|
119
|
-
curve_mean: @curve_mean,
|
120
|
-
distance_mean: @distance_mean,
|
121
|
-
update: @update }
|
122
|
-
end
|
123
|
-
|
124
|
-
# Load marshal data.
|
125
|
-
# @return [nis]
|
126
|
-
def marshal_load(obj)
|
127
|
-
@params = obj[:params]
|
128
|
-
@smth_learning_rate = obj[:smth_learning_rate]
|
129
|
-
@smth_momentum = obj[:smth_momentum]
|
130
|
-
@grad_norms = obj[:grad_norms]
|
131
|
-
@grad_norm_min = obj[:grad_norm_min]
|
132
|
-
@grad_norm_max = obj[:grad_norm_max]
|
133
|
-
@grad_mean_sqr = obj[:grad_mean_sqr]
|
134
|
-
@grad_mean = obj[:grad_mean]
|
135
|
-
@grad_var = obj[:grad_var]
|
136
|
-
@grad_norm_mean = obj[:grad_norm_mean]
|
137
|
-
@curve_mean = obj[:curve_mean]
|
138
|
-
@distance_mean = obj[:distance_mean]
|
139
|
-
@update = obj[:update]
|
140
|
-
nil
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
@@ -1,91 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'svmkit/validation'
|
4
|
-
|
5
|
-
module SVMKit
|
6
|
-
# Module for calculating pairwise distances, similarities, and kernels.
|
7
|
-
module PairwiseMetric
|
8
|
-
class << self
|
9
|
-
# Calculate the pairwise euclidean distances between x and y.
|
10
|
-
#
|
11
|
-
# @param x [Numo::DFloat] (shape: [n_samples_x, n_features])
|
12
|
-
# @param y [Numo::DFloat] (shape: [n_samples_y, n_features])
|
13
|
-
# @return [Numo::DFloat] (shape: [n_samples_x, n_samples_x] or [n_samples_x, n_samples_y] if y is given)
|
14
|
-
def euclidean_distance(x, y = nil)
|
15
|
-
y = x if y.nil?
|
16
|
-
SVMKit::Validation.check_sample_array(x)
|
17
|
-
SVMKit::Validation.check_sample_array(y)
|
18
|
-
sum_x_vec = (x**2).sum(1)
|
19
|
-
sum_y_vec = (y**2).sum(1)
|
20
|
-
dot_xy_mat = x.dot(y.transpose)
|
21
|
-
distance_matrix = dot_xy_mat * -2.0 +
|
22
|
-
sum_x_vec.tile(y.shape[0], 1).transpose +
|
23
|
-
sum_y_vec.tile(x.shape[0], 1)
|
24
|
-
Numo::NMath.sqrt(distance_matrix.abs)
|
25
|
-
end
|
26
|
-
|
27
|
-
# Calculate the rbf kernel between x and y.
|
28
|
-
#
|
29
|
-
# @param x [Numo::DFloat] (shape: [n_samples_x, n_features])
|
30
|
-
# @param y [Numo::DFloat] (shape: [n_samples_y, n_features])
|
31
|
-
# @param gamma [Float] The parameter of rbf kernel, if nil it is 1 / n_features.
|
32
|
-
# @return [Numo::DFloat] (shape: [n_samples_x, n_samples_x] or [n_samples_x, n_samples_y] if y is given)
|
33
|
-
def rbf_kernel(x, y = nil, gamma = nil)
|
34
|
-
y = x if y.nil?
|
35
|
-
gamma ||= 1.0 / x.shape[1]
|
36
|
-
SVMKit::Validation.check_sample_array(x)
|
37
|
-
SVMKit::Validation.check_sample_array(y)
|
38
|
-
SVMKit::Validation.check_params_float(gamma: gamma)
|
39
|
-
distance_matrix = euclidean_distance(x, y)
|
40
|
-
Numo::NMath.exp((distance_matrix**2) * -gamma)
|
41
|
-
end
|
42
|
-
|
43
|
-
# Calculate the linear kernel between x and y.
|
44
|
-
#
|
45
|
-
# @param x [Numo::DFloat] (shape: [n_samples_x, n_features])
|
46
|
-
# @param y [Numo::DFloat] (shape: [n_samples_y, n_features])
|
47
|
-
# @return [Numo::DFloat] (shape: [n_samples_x, n_samples_x] or [n_samples_x, n_samples_y] if y is given)
|
48
|
-
def linear_kernel(x, y = nil)
|
49
|
-
y = x if y.nil?
|
50
|
-
SVMKit::Validation.check_sample_array(x)
|
51
|
-
SVMKit::Validation.check_sample_array(y)
|
52
|
-
x.dot(y.transpose)
|
53
|
-
end
|
54
|
-
|
55
|
-
# Calculate the polynomial kernel between x and y.
|
56
|
-
#
|
57
|
-
# @param x [Numo::DFloat] (shape: [n_samples_x, n_features])
|
58
|
-
# @param y [Numo::DFloat] (shape: [n_samples_y, n_features])
|
59
|
-
# @param degree [Integer] The parameter of polynomial kernel.
|
60
|
-
# @param gamma [Float] The parameter of polynomial kernel, if nil it is 1 / n_features.
|
61
|
-
# @param coef [Integer] The parameter of polynomial kernel.
|
62
|
-
# @return [Numo::DFloat] (shape: [n_samples_x, n_samples_x] or [n_samples_x, n_samples_y] if y is given)
|
63
|
-
def polynomial_kernel(x, y = nil, degree = 3, gamma = nil, coef = 1)
|
64
|
-
y = x if y.nil?
|
65
|
-
gamma ||= 1.0 / x.shape[1]
|
66
|
-
SVMKit::Validation.check_sample_array(x)
|
67
|
-
SVMKit::Validation.check_sample_array(y)
|
68
|
-
SVMKit::Validation.check_params_float(gamma: gamma)
|
69
|
-
SVMKit::Validation.check_params_integer(degree: degree, coef: coef)
|
70
|
-
(x.dot(y.transpose) * gamma + coef)**degree
|
71
|
-
end
|
72
|
-
|
73
|
-
# Calculate the sigmoid kernel between x and y.
|
74
|
-
#
|
75
|
-
# @param x [Numo::DFloat] (shape: [n_samples_x, n_features])
|
76
|
-
# @param y [Numo::DFloat] (shape: [n_samples_y, n_features])
|
77
|
-
# @param gamma [Float] The parameter of polynomial kernel, if nil it is 1 / n_features.
|
78
|
-
# @param coef [Integer] The parameter of polynomial kernel.
|
79
|
-
# @return [Numo::DFloat] (shape: [n_samples_x, n_samples_x] or [n_samples_x, n_samples_y] if y is given)
|
80
|
-
def sigmoid_kernel(x, y = nil, gamma = nil, coef = 1)
|
81
|
-
y = x if y.nil?
|
82
|
-
gamma ||= 1.0 / x.shape[1]
|
83
|
-
SVMKit::Validation.check_sample_array(x)
|
84
|
-
SVMKit::Validation.check_sample_array(y)
|
85
|
-
SVMKit::Validation.check_params_float(gamma: gamma)
|
86
|
-
SVMKit::Validation.check_params_integer(coef: coef)
|
87
|
-
Numo::NMath.tanh(x.dot(y.transpose) * gamma + coef)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|