rumale 0.13.8 → 0.14.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 +24 -0
- data/README.md +8 -10
- data/lib/rumale.rb +3 -0
- data/lib/rumale/base/classifier.rb +2 -2
- data/lib/rumale/base/cluster_analyzer.rb +2 -2
- data/lib/rumale/base/regressor.rb +2 -2
- data/lib/rumale/clustering/dbscan.rb +3 -4
- data/lib/rumale/clustering/gaussian_mixture.rb +5 -6
- data/lib/rumale/clustering/hdbscan.rb +4 -4
- data/lib/rumale/clustering/k_means.rb +5 -6
- data/lib/rumale/clustering/k_medoids.rb +5 -6
- data/lib/rumale/clustering/power_iteration.rb +4 -6
- data/lib/rumale/clustering/single_linkage.rb +3 -3
- data/lib/rumale/clustering/snn.rb +1 -1
- data/lib/rumale/clustering/spectral_clustering.rb +4 -6
- data/lib/rumale/dataset.rb +6 -10
- data/lib/rumale/decomposition/factor_analysis.rb +4 -4
- data/lib/rumale/decomposition/fast_ica.rb +6 -7
- data/lib/rumale/decomposition/nmf.rb +6 -7
- data/lib/rumale/decomposition/pca.rb +6 -7
- data/lib/rumale/ensemble/ada_boost_classifier.rb +8 -8
- data/lib/rumale/ensemble/ada_boost_regressor.rb +7 -7
- data/lib/rumale/ensemble/extra_trees_classifier.rb +8 -8
- data/lib/rumale/ensemble/extra_trees_regressor.rb +7 -7
- data/lib/rumale/ensemble/gradient_boosting_classifier.rb +8 -8
- data/lib/rumale/ensemble/gradient_boosting_regressor.rb +8 -8
- data/lib/rumale/ensemble/random_forest_classifier.rb +8 -8
- data/lib/rumale/ensemble/random_forest_regressor.rb +7 -7
- data/lib/rumale/evaluation_measure/accuracy.rb +2 -2
- data/lib/rumale/evaluation_measure/adjusted_rand_score.rb +2 -2
- data/lib/rumale/evaluation_measure/calinski_harabasz_score.rb +2 -2
- data/lib/rumale/evaluation_measure/davies_bouldin_score.rb +2 -2
- data/lib/rumale/evaluation_measure/explained_variance_score.rb +2 -2
- data/lib/rumale/evaluation_measure/f_score.rb +2 -2
- data/lib/rumale/evaluation_measure/log_loss.rb +2 -2
- data/lib/rumale/evaluation_measure/mean_absolute_error.rb +2 -2
- data/lib/rumale/evaluation_measure/mean_squared_error.rb +2 -2
- data/lib/rumale/evaluation_measure/mean_squared_log_error.rb +2 -2
- data/lib/rumale/evaluation_measure/median_absolute_error.rb +2 -2
- data/lib/rumale/evaluation_measure/mutual_information.rb +2 -2
- data/lib/rumale/evaluation_measure/normalized_mutual_information.rb +2 -2
- data/lib/rumale/evaluation_measure/precision.rb +2 -2
- data/lib/rumale/evaluation_measure/purity.rb +2 -2
- data/lib/rumale/evaluation_measure/r2_score.rb +2 -2
- data/lib/rumale/evaluation_measure/recall.rb +2 -2
- data/lib/rumale/evaluation_measure/roc_auc.rb +6 -3
- data/lib/rumale/evaluation_measure/silhouette_score.rb +2 -2
- data/lib/rumale/kernel_approximation/rbf.rb +5 -6
- data/lib/rumale/kernel_machine/kernel_pca.rb +4 -4
- data/lib/rumale/kernel_machine/kernel_ridge.rb +3 -3
- data/lib/rumale/kernel_machine/kernel_svc.rb +7 -8
- data/lib/rumale/linear_model/lasso.rb +5 -6
- data/lib/rumale/linear_model/linear_regression.rb +5 -6
- data/lib/rumale/linear_model/logistic_regression.rb +16 -15
- data/lib/rumale/linear_model/ridge.rb +5 -6
- data/lib/rumale/linear_model/svc.rb +34 -28
- data/lib/rumale/linear_model/svr.rb +5 -6
- data/lib/rumale/manifold/mds.rb +3 -4
- data/lib/rumale/manifold/tsne.rb +3 -5
- data/lib/rumale/model_selection/cross_validation.rb +6 -5
- data/lib/rumale/model_selection/grid_search_cv.rb +6 -6
- data/lib/rumale/model_selection/k_fold.rb +3 -3
- data/lib/rumale/model_selection/shuffle_split.rb +3 -5
- data/lib/rumale/model_selection/stratified_k_fold.rb +4 -4
- data/lib/rumale/model_selection/stratified_shuffle_split.rb +4 -6
- data/lib/rumale/multiclass/one_vs_rest_classifier.rb +4 -4
- data/lib/rumale/naive_bayes/naive_bayes.rb +14 -14
- data/lib/rumale/nearest_neighbors/k_neighbors_classifier.rb +5 -5
- data/lib/rumale/nearest_neighbors/k_neighbors_regressor.rb +4 -4
- data/lib/rumale/neural_network/base_mlp.rb +244 -0
- data/lib/rumale/neural_network/mlp_classifier.rb +119 -0
- data/lib/rumale/neural_network/mlp_regressor.rb +89 -0
- data/lib/rumale/optimizer/ada_grad.rb +1 -1
- data/lib/rumale/optimizer/adam.rb +3 -3
- data/lib/rumale/optimizer/nadam.rb +1 -1
- data/lib/rumale/optimizer/rmsprop.rb +1 -1
- data/lib/rumale/optimizer/sgd.rb +1 -1
- data/lib/rumale/optimizer/yellow_fin.rb +1 -2
- data/lib/rumale/pairwise_metric.rb +17 -19
- data/lib/rumale/pipeline/pipeline.rb +10 -10
- data/lib/rumale/polynomial_model/factorization_machine_classifier.rb +29 -21
- data/lib/rumale/polynomial_model/factorization_machine_regressor.rb +6 -6
- data/lib/rumale/preprocessing/bin_discretizer.rb +3 -3
- data/lib/rumale/preprocessing/l2_normalizer.rb +2 -2
- data/lib/rumale/preprocessing/label_binarizer.rb +2 -2
- data/lib/rumale/preprocessing/label_encoder.rb +1 -1
- data/lib/rumale/preprocessing/max_abs_scaler.rb +3 -3
- data/lib/rumale/preprocessing/min_max_scaler.rb +3 -3
- data/lib/rumale/preprocessing/one_hot_encoder.rb +4 -3
- data/lib/rumale/preprocessing/ordinal_encoder.rb +1 -1
- data/lib/rumale/preprocessing/standard_scaler.rb +3 -3
- data/lib/rumale/tree/base_decision_tree.rb +1 -1
- data/lib/rumale/tree/decision_tree_classifier.rb +7 -7
- data/lib/rumale/tree/decision_tree_regressor.rb +6 -6
- data/lib/rumale/tree/extra_tree_classifier.rb +7 -7
- data/lib/rumale/tree/extra_tree_regressor.rb +6 -6
- data/lib/rumale/tree/gradient_tree_regressor.rb +9 -9
- data/lib/rumale/validation.rb +32 -2
- data/lib/rumale/version.rb +1 -1
- data/rumale.gemspec +7 -7
- metadata +11 -7
@@ -0,0 +1,119 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rumale/base/classifier'
|
4
|
+
require 'rumale/neural_network/base_mlp'
|
5
|
+
require 'rumale/preprocessing/label_binarizer'
|
6
|
+
|
7
|
+
module Rumale
|
8
|
+
module NeuralNetwork
|
9
|
+
# MLPClassifier is a class that implements classifier based on multi-layer perceptron.
|
10
|
+
# MLPClassifier use ReLu as the activation function and Adam as the optimization method
|
11
|
+
# and softmax cross entropy as the loss function.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# estimator = Rumale::NeuralNetwork::MLPClassifier.new(hidden_units: [100, 100], dropout_rate: 0.3)
|
15
|
+
# estimator.fit(training_samples, traininig_labels)
|
16
|
+
# results = estimator.predict(testing_samples)
|
17
|
+
class MLPClassifier < BaseMLP
|
18
|
+
include Base::Classifier
|
19
|
+
|
20
|
+
# Return the network.
|
21
|
+
# @return [Rumale::NeuralNetwork::Model::Sequential]
|
22
|
+
attr_reader :network
|
23
|
+
|
24
|
+
# Return the class labels.
|
25
|
+
# @return [Numo::Int32] (size: n_classes)
|
26
|
+
attr_reader :classes
|
27
|
+
|
28
|
+
# Return the number of iterations run for optimization
|
29
|
+
# @return [Integer]
|
30
|
+
attr_reader :n_iter
|
31
|
+
|
32
|
+
# Return the random generator.
|
33
|
+
# @return [Random]
|
34
|
+
attr_reader :rng
|
35
|
+
|
36
|
+
# Create a new classifier with multi-layer preceptron.
|
37
|
+
#
|
38
|
+
# @param hidden_units [Array] The number of units in the i-th hidden layer.
|
39
|
+
# @param dropout_rate [Float] The rate of the units to drop.
|
40
|
+
# @param learning_rate [Float] The initial value of learning rate in Adam optimizer.
|
41
|
+
# @param decay1 [Float] The smoothing parameter for the first moment in Adam optimizer.
|
42
|
+
# @param decay2 [Float] The smoothing parameter for the second moment in Adam optimizer.
|
43
|
+
# @param max_iter [Integer] The maximum number of iterations.
|
44
|
+
# @param batch_size [Intger] The size of the mini batches.
|
45
|
+
# @param tol [Float] The tolerance of loss for terminating optimization.
|
46
|
+
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
47
|
+
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
48
|
+
def initialize(hidden_units: [128, 128], dropout_rate: 0.4, learning_rate: 0.001, decay1: 0.9, decay2: 0.999,
|
49
|
+
max_iter: 10000, batch_size: 50, tol: 1e-4, verbose: false, random_seed: nil)
|
50
|
+
check_params_type(Array, hidden_units: hidden_units)
|
51
|
+
check_params_numeric(dropout_rate: dropout_rate, learning_rate: learning_rate, decay1: decay1, decay2: decay2,
|
52
|
+
max_iter: max_iter, batch_size: batch_size, tol: tol)
|
53
|
+
check_params_boolean(verbose: verbose)
|
54
|
+
check_params_numeric_or_nil(random_seed: random_seed)
|
55
|
+
super
|
56
|
+
@classes = nil
|
57
|
+
@network = nil
|
58
|
+
end
|
59
|
+
|
60
|
+
# Fit the model with given training data.
|
61
|
+
#
|
62
|
+
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The training data to be used for fitting the model.
|
63
|
+
# @param y [Numo::Int32] (shape: [n_samples]) The labels to be used for fitting the model.
|
64
|
+
# @return [MLPClassifier] The learned classifier itself.
|
65
|
+
def fit(x, y)
|
66
|
+
x = check_convert_sample_array(x)
|
67
|
+
y = check_convert_label_array(y)
|
68
|
+
check_sample_label_size(x, y)
|
69
|
+
|
70
|
+
@classes = Numo::Int32[*y.to_a.uniq.sort]
|
71
|
+
n_labels = @classes.size
|
72
|
+
n_features = x.shape[1]
|
73
|
+
sub_rng = @rng.dup
|
74
|
+
|
75
|
+
loss = Loss::SoftmaxCrossEntropy.new
|
76
|
+
@network = buld_network(n_features, n_labels, sub_rng)
|
77
|
+
@network = train(x, one_hot_encode(y), @network, loss, sub_rng)
|
78
|
+
@network.delete_dropout
|
79
|
+
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
# Predict class labels for samples.
|
84
|
+
#
|
85
|
+
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the labels.
|
86
|
+
# @return [Numo::Int32] (shape: [n_samples]) Predicted class label per sample.
|
87
|
+
def predict(x)
|
88
|
+
x = check_convert_sample_array(x)
|
89
|
+
n_samples = x.shape[0]
|
90
|
+
decision_values = predict_proba(x)
|
91
|
+
predicted = Array.new(n_samples) { |n| @classes[decision_values[n, true].max_index] }
|
92
|
+
Numo::Int32.asarray(predicted)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Predict probability for samples.
|
96
|
+
#
|
97
|
+
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the probailities.
|
98
|
+
# @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted probability of each class per sample.
|
99
|
+
def predict_proba(x)
|
100
|
+
x = check_convert_sample_array(x)
|
101
|
+
out, = @network.forward(x)
|
102
|
+
softmax(out)
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def one_hot_encode(y)
|
108
|
+
encoder = Rumale::Preprocessing::LabelBinarizer.new
|
109
|
+
encoder.fit_transform(y)
|
110
|
+
end
|
111
|
+
|
112
|
+
def softmax(x)
|
113
|
+
clip = x.max(-1).expand_dims(-1)
|
114
|
+
exp_x = Numo::NMath.exp(x - clip)
|
115
|
+
exp_x / exp_x.sum(-1).expand_dims(-1)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rumale/base/regressor'
|
4
|
+
require 'rumale/neural_network/base_mlp'
|
5
|
+
|
6
|
+
module Rumale
|
7
|
+
module NeuralNetwork
|
8
|
+
# MLPRegressor is a class that implements regressor based on multi-layer perceptron.
|
9
|
+
# MLPRegressor use ReLu as the activation function and Adam as the optimization method
|
10
|
+
# and mean squared error as the loss function.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# estimator = Rumale::NeuralNetwork::MLPRegressor.new(hidden_units: [100, 100], dropout_rate: 0.3)
|
14
|
+
# estimator.fit(training_samples, traininig_labels)
|
15
|
+
# results = estimator.predict(testing_samples)
|
16
|
+
class MLPRegressor < BaseMLP
|
17
|
+
include Base::Regressor
|
18
|
+
|
19
|
+
# Return the network.
|
20
|
+
# @return [Rumale::NeuralNetwork::Model::Sequential]
|
21
|
+
attr_reader :network
|
22
|
+
|
23
|
+
# Return the number of iterations run for optimization
|
24
|
+
# @return [Integer]
|
25
|
+
attr_reader :n_iter
|
26
|
+
|
27
|
+
# Return the random generator.
|
28
|
+
# @return [Random]
|
29
|
+
attr_reader :rng
|
30
|
+
|
31
|
+
# Create a new regressor with multi-layer perceptron.
|
32
|
+
#
|
33
|
+
# @param hidden_units [Array] The number of units in the i-th hidden layer.
|
34
|
+
# @param dropout_rate [Float] The rate of the units to drop.
|
35
|
+
# @param learning_rate [Float] The initial value of learning rate in Adam optimizer.
|
36
|
+
# @param decay1 [Float] The smoothing parameter for the first moment in Adam optimizer.
|
37
|
+
# @param decay2 [Float] The smoothing parameter for the second moment in Adam optimizer.
|
38
|
+
# @param max_iter [Integer] The maximum number of iterations.
|
39
|
+
# @param batch_size [Intger] The size of the mini batches.
|
40
|
+
# @param tol [Float] The tolerance of loss for terminating optimization.
|
41
|
+
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
42
|
+
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
43
|
+
def initialize(hidden_units: [128, 128], dropout_rate: 0.4, learning_rate: 0.001, decay1: 0.9, decay2: 0.999,
|
44
|
+
max_iter: 10000, batch_size: 50, tol: 1e-4, verbose: false, random_seed: nil)
|
45
|
+
check_params_type(Array, hidden_units: hidden_units)
|
46
|
+
check_params_numeric(dropout_rate: dropout_rate, learning_rate: learning_rate, decay1: decay1, decay2: decay2,
|
47
|
+
max_iter: max_iter, batch_size: batch_size, tol: tol)
|
48
|
+
check_params_boolean(verbose: verbose)
|
49
|
+
check_params_numeric_or_nil(random_seed: random_seed)
|
50
|
+
super
|
51
|
+
@network = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
# Fit the model with given training data.
|
55
|
+
#
|
56
|
+
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The training data to be used for fitting the model.
|
57
|
+
# @param y [Numo::DFloat] (shape: [n_samples, n_outputs]) The taget values to be used for fitting the model.
|
58
|
+
# @return [MLPRegressor] The learned regressor itself.
|
59
|
+
def fit(x, y)
|
60
|
+
x = check_convert_sample_array(x)
|
61
|
+
y = check_convert_tvalue_array(y)
|
62
|
+
check_sample_tvalue_size(x, y)
|
63
|
+
|
64
|
+
y = y.expand_dims(1) if y.ndim == 1
|
65
|
+
n_targets = y.shape[1]
|
66
|
+
n_features = x.shape[1]
|
67
|
+
sub_rng = @rng.dup
|
68
|
+
|
69
|
+
loss = Loss::MeanSquaredError.new
|
70
|
+
@network = buld_network(n_features, n_targets, sub_rng)
|
71
|
+
@network = train(x, y, @network, loss, sub_rng)
|
72
|
+
@network.delete_dropout
|
73
|
+
|
74
|
+
self
|
75
|
+
end
|
76
|
+
|
77
|
+
# Predict values for samples.
|
78
|
+
#
|
79
|
+
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the values.
|
80
|
+
# @return [Numo::DFloat] (shape: [n_samples, n_outputs]) Predicted values per sample.
|
81
|
+
def predict(x)
|
82
|
+
x = check_convert_sample_array(x)
|
83
|
+
out, = @network.forward(x)
|
84
|
+
out = out[true, 0] if out.shape[1] == 1
|
85
|
+
out
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -22,7 +22,7 @@ module Rumale
|
|
22
22
|
#
|
23
23
|
# @param learning_rate [Float] The initial value of learning rate.
|
24
24
|
def initialize(learning_rate: 0.01)
|
25
|
-
|
25
|
+
check_params_numeric(learning_rate: learning_rate)
|
26
26
|
check_params_positive(learning_rate: learning_rate)
|
27
27
|
@params = {}
|
28
28
|
@params[:learning_rate] = learning_rate
|
@@ -24,7 +24,7 @@ module Rumale
|
|
24
24
|
# @param decay1 [Float] The smoothing parameter for the first moment.
|
25
25
|
# @param decay2 [Float] The smoothing parameter for the second moment.
|
26
26
|
def initialize(learning_rate: 0.001, decay1: 0.9, decay2: 0.999)
|
27
|
-
|
27
|
+
check_params_numeric(learning_rate: learning_rate, decay1: decay1, decay2: decay2)
|
28
28
|
check_params_positive(learning_rate: learning_rate, decay1: decay1, decay2: decay2)
|
29
29
|
@params = {}
|
30
30
|
@params[:learning_rate] = learning_rate
|
@@ -41,8 +41,8 @@ module Rumale
|
|
41
41
|
# @param gradient [Numo::DFloat] (shape: [n_features]) The gradient for updating the weight.
|
42
42
|
# @return [Numo::DFloat] (shape: [n_feautres]) The updated weight.
|
43
43
|
def call(weight, gradient)
|
44
|
-
@fst_moment ||= Numo::DFloat.zeros(weight.shape
|
45
|
-
@sec_moment ||= Numo::DFloat.zeros(weight.shape
|
44
|
+
@fst_moment ||= Numo::DFloat.zeros(weight.shape)
|
45
|
+
@sec_moment ||= Numo::DFloat.zeros(weight.shape)
|
46
46
|
|
47
47
|
@iter += 1
|
48
48
|
|
@@ -25,7 +25,7 @@ module Rumale
|
|
25
25
|
# @param decay1 [Float] The smoothing parameter for the first moment.
|
26
26
|
# @param decay2 [Float] The smoothing parameter for the second moment.
|
27
27
|
def initialize(learning_rate: 0.01, decay1: 0.9, decay2: 0.999)
|
28
|
-
|
28
|
+
check_params_numeric(learning_rate: learning_rate, decay1: decay1, decay2: decay2)
|
29
29
|
check_params_positive(learning_rate: learning_rate, decay1: decay1, decay2: decay2)
|
30
30
|
@params = {}
|
31
31
|
@params[:learning_rate] = learning_rate
|
@@ -25,7 +25,7 @@ module Rumale
|
|
25
25
|
# @param momentum [Float] The initial value of momentum.
|
26
26
|
# @param decay [Float] The smooting parameter.
|
27
27
|
def initialize(learning_rate: 0.01, momentum: 0.9, decay: 0.9)
|
28
|
-
|
28
|
+
check_params_numeric(learning_rate: learning_rate, momentum: momentum, decay: decay)
|
29
29
|
check_params_positive(learning_rate: learning_rate, momentum: momentum, decay: decay)
|
30
30
|
@params = {}
|
31
31
|
@params[:learning_rate] = learning_rate
|
data/lib/rumale/optimizer/sgd.rb
CHANGED
@@ -21,7 +21,7 @@ module Rumale
|
|
21
21
|
# @param momentum [Float] The initial value of momentum.
|
22
22
|
# @param decay [Float] The smooting parameter.
|
23
23
|
def initialize(learning_rate: 0.01, momentum: 0.0, decay: 0.0)
|
24
|
-
|
24
|
+
check_params_numeric(learning_rate: learning_rate, momentum: momentum, decay: decay)
|
25
25
|
check_params_positive(learning_rate: learning_rate, momentum: momentum, decay: decay)
|
26
26
|
@params = {}
|
27
27
|
@params[:learning_rate] = learning_rate
|
@@ -25,8 +25,7 @@ module Rumale
|
|
25
25
|
# @param decay [Float] The smooting parameter.
|
26
26
|
# @param window_width [Integer] The sliding window width for searching curvature range.
|
27
27
|
def initialize(learning_rate: 0.01, momentum: 0.9, decay: 0.999, window_width: 20)
|
28
|
-
|
29
|
-
check_params_integer(window_width: window_width)
|
28
|
+
check_params_numeric(learning_rate: learning_rate, momentum: momentum, decay: decay, window_width: window_width)
|
30
29
|
check_params_positive(learning_rate: learning_rate, momentum: momentum, decay: decay, window_width: window_width)
|
31
30
|
@params = {}
|
32
31
|
@params[:learning_rate] = learning_rate
|
@@ -13,8 +13,8 @@ module Rumale
|
|
13
13
|
# @return [Numo::DFloat] (shape: [n_samples_x, n_samples_x] or [n_samples_x, n_samples_y] if y is given)
|
14
14
|
def euclidean_distance(x, y = nil)
|
15
15
|
y = x if y.nil?
|
16
|
-
Rumale::Validation.
|
17
|
-
Rumale::Validation.
|
16
|
+
x = Rumale::Validation.check_convert_sample_array(x)
|
17
|
+
y = Rumale::Validation.check_convert_sample_array(y)
|
18
18
|
Numo::NMath.sqrt(squared_error(x, y).abs)
|
19
19
|
end
|
20
20
|
|
@@ -25,8 +25,8 @@ module Rumale
|
|
25
25
|
# @return [Numo::DFloat] (shape: [n_samples_x, n_samples_x] or [n_samples_x, n_samples_y] if y is given)
|
26
26
|
def manhattan_distance(x, y = nil)
|
27
27
|
y = x if y.nil?
|
28
|
-
Rumale::Validation.
|
29
|
-
Rumale::Validation.
|
28
|
+
x = Rumale::Validation.check_convert_sample_array(x)
|
29
|
+
y = Rumale::Validation.check_convert_sample_array(y)
|
30
30
|
n_samples_x = x.shape[0]
|
31
31
|
n_samples_y = y.shape[0]
|
32
32
|
distance_mat = Numo::DFloat.zeros(n_samples_x, n_samples_y)
|
@@ -43,8 +43,8 @@ module Rumale
|
|
43
43
|
# @return [Numo::DFloat] (shape: [n_samples_x, n_samples_x] or [n_samples_x, n_samples_y] if y is given)
|
44
44
|
def squared_error(x, y = nil)
|
45
45
|
y = x if y.nil?
|
46
|
-
Rumale::Validation.
|
47
|
-
Rumale::Validation.
|
46
|
+
x = Rumale::Validation.check_convert_sample_array(x)
|
47
|
+
y = Rumale::Validation.check_convert_sample_array(y)
|
48
48
|
n_features = x.shape[1]
|
49
49
|
one_vec = Numo::DFloat.ones(n_features).expand_dims(1)
|
50
50
|
sum_x_vec = (x**2).dot(one_vec)
|
@@ -62,9 +62,9 @@ module Rumale
|
|
62
62
|
def rbf_kernel(x, y = nil, gamma = nil)
|
63
63
|
y = x if y.nil?
|
64
64
|
gamma ||= 1.0 / x.shape[1]
|
65
|
-
Rumale::Validation.
|
66
|
-
Rumale::Validation.
|
67
|
-
Rumale::Validation.
|
65
|
+
x = Rumale::Validation.check_convert_sample_array(x)
|
66
|
+
y = Rumale::Validation.check_convert_sample_array(y)
|
67
|
+
Rumale::Validation.check_params_numeric(gamma: gamma)
|
68
68
|
Numo::NMath.exp(-gamma * squared_error(x, y).abs)
|
69
69
|
end
|
70
70
|
|
@@ -75,8 +75,8 @@ module Rumale
|
|
75
75
|
# @return [Numo::DFloat] (shape: [n_samples_x, n_samples_x] or [n_samples_x, n_samples_y] if y is given)
|
76
76
|
def linear_kernel(x, y = nil)
|
77
77
|
y = x if y.nil?
|
78
|
-
Rumale::Validation.
|
79
|
-
Rumale::Validation.
|
78
|
+
x = Rumale::Validation.check_convert_sample_array(x)
|
79
|
+
y = Rumale::Validation.check_convert_sample_array(y)
|
80
80
|
x.dot(y.transpose)
|
81
81
|
end
|
82
82
|
|
@@ -91,10 +91,9 @@ module Rumale
|
|
91
91
|
def polynomial_kernel(x, y = nil, degree = 3, gamma = nil, coef = 1)
|
92
92
|
y = x if y.nil?
|
93
93
|
gamma ||= 1.0 / x.shape[1]
|
94
|
-
Rumale::Validation.
|
95
|
-
Rumale::Validation.
|
96
|
-
Rumale::Validation.
|
97
|
-
Rumale::Validation.check_params_integer(degree: degree, coef: coef)
|
94
|
+
x = Rumale::Validation.check_convert_sample_array(x)
|
95
|
+
y = Rumale::Validation.check_convert_sample_array(y)
|
96
|
+
Rumale::Validation.check_params_numeric(gamma: gamma, degree: degree, coef: coef)
|
98
97
|
(x.dot(y.transpose) * gamma + coef)**degree
|
99
98
|
end
|
100
99
|
|
@@ -108,10 +107,9 @@ module Rumale
|
|
108
107
|
def sigmoid_kernel(x, y = nil, gamma = nil, coef = 1)
|
109
108
|
y = x if y.nil?
|
110
109
|
gamma ||= 1.0 / x.shape[1]
|
111
|
-
Rumale::Validation.
|
112
|
-
Rumale::Validation.
|
113
|
-
Rumale::Validation.
|
114
|
-
Rumale::Validation.check_params_integer(coef: coef)
|
110
|
+
x = Rumale::Validation.check_convert_sample_array(x)
|
111
|
+
y = Rumale::Validation.check_convert_sample_array(y)
|
112
|
+
Rumale::Validation.check_params_numeric(gamma: gamma, coef: coef)
|
115
113
|
Numo::NMath.tanh(x.dot(y.transpose) * gamma + coef)
|
116
114
|
end
|
117
115
|
end
|
@@ -40,7 +40,7 @@ module Rumale
|
|
40
40
|
# @param y [Numo::NArray] (shape: [n_samples, n_outputs]) The target values or labels to be used for fitting the model.
|
41
41
|
# @return [Pipeline] The learned pipeline itself.
|
42
42
|
def fit(x, y)
|
43
|
-
|
43
|
+
x = check_convert_sample_array(x)
|
44
44
|
trans_x = apply_transforms(x, y, fit: true)
|
45
45
|
last_estimator&.fit(trans_x, y)
|
46
46
|
self
|
@@ -52,7 +52,7 @@ module Rumale
|
|
52
52
|
# @param y [Numo::NArray] (shape: [n_samples, n_outputs], default: nil) The target values or labels to be used for fitting the model.
|
53
53
|
# @return [Numo::NArray] The predicted results by last estimator.
|
54
54
|
def fit_predict(x, y = nil)
|
55
|
-
|
55
|
+
x = check_convert_sample_array(x)
|
56
56
|
trans_x = apply_transforms(x, y, fit: true)
|
57
57
|
last_estimator.fit_predict(trans_x)
|
58
58
|
end
|
@@ -63,7 +63,7 @@ module Rumale
|
|
63
63
|
# @param y [Numo::NArray] (shape: [n_samples, n_outputs], default: nil) The target values or labels to be used for fitting the model.
|
64
64
|
# @return [Numo::NArray] The predicted results by last estimator.
|
65
65
|
def fit_transform(x, y = nil)
|
66
|
-
|
66
|
+
x = check_convert_sample_array(x)
|
67
67
|
trans_x = apply_transforms(x, y, fit: true)
|
68
68
|
last_estimator.fit_transform(trans_x, y)
|
69
69
|
end
|
@@ -73,7 +73,7 @@ module Rumale
|
|
73
73
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to compute the scores.
|
74
74
|
# @return [Numo::DFloat] (shape: [n_samples]) Confidence score per sample.
|
75
75
|
def decision_function(x)
|
76
|
-
|
76
|
+
x = check_convert_sample_array(x)
|
77
77
|
trans_x = apply_transforms(x)
|
78
78
|
last_estimator.decision_function(trans_x)
|
79
79
|
end
|
@@ -83,7 +83,7 @@ module Rumale
|
|
83
83
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to obtain prediction result.
|
84
84
|
# @return [Numo::NArray] The predicted results by last estimator.
|
85
85
|
def predict(x)
|
86
|
-
|
86
|
+
x = check_convert_sample_array(x)
|
87
87
|
trans_x = apply_transforms(x)
|
88
88
|
last_estimator.predict(trans_x)
|
89
89
|
end
|
@@ -93,7 +93,7 @@ module Rumale
|
|
93
93
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the log-probailities.
|
94
94
|
# @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted log-probability of each class per sample.
|
95
95
|
def predict_log_proba(x)
|
96
|
-
|
96
|
+
x = check_convert_sample_array(x)
|
97
97
|
trans_x = apply_transforms(x)
|
98
98
|
last_estimator.predict_log_proba(trans_x)
|
99
99
|
end
|
@@ -103,7 +103,7 @@ module Rumale
|
|
103
103
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the probailities.
|
104
104
|
# @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted probability of each class per sample.
|
105
105
|
def predict_proba(x)
|
106
|
-
|
106
|
+
x = check_convert_sample_array(x)
|
107
107
|
trans_x = apply_transforms(x)
|
108
108
|
last_estimator.predict_proba(trans_x)
|
109
109
|
end
|
@@ -113,7 +113,7 @@ module Rumale
|
|
113
113
|
# @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to be transformed.
|
114
114
|
# @return [Numo::DFloat] (shape: [n_samples, n_components]) The transformed samples.
|
115
115
|
def transform(x)
|
116
|
-
|
116
|
+
x = check_convert_sample_array(x)
|
117
117
|
trans_x = apply_transforms(x)
|
118
118
|
last_estimator.nil? ? trans_x : last_estimator.transform(trans_x)
|
119
119
|
end
|
@@ -123,7 +123,7 @@ module Rumale
|
|
123
123
|
# @param z [Numo::DFloat] (shape: [n_samples, n_components]) The transformed samples to be restored into original space.
|
124
124
|
# @return [Numo::DFloat] (shape: [n_samples, n_featuress]) The restored samples.
|
125
125
|
def inverse_transform(z)
|
126
|
-
|
126
|
+
z = check_convert_sample_array(z)
|
127
127
|
itrans_z = z
|
128
128
|
@steps.keys.reverse_each do |name|
|
129
129
|
transformer = @steps[name]
|
@@ -139,7 +139,7 @@ module Rumale
|
|
139
139
|
# @param y [Numo::NArray] (shape: [n_samples, n_outputs]) True target values or labels for testing data.
|
140
140
|
# @return [Float] The score of last estimator
|
141
141
|
def score(x, y)
|
142
|
-
|
142
|
+
x = check_convert_sample_array(x)
|
143
143
|
trans_x = apply_transforms(x)
|
144
144
|
last_estimator.score(trans_x, y)
|
145
145
|
end
|