rumale 0.13.2 → 0.13.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 948ea0c8e1c7d41704f0259ecd75dc2c4dd3e10f
4
- data.tar.gz: 66adfaeb23d85aafc8cdea65bdda628ed1b481a8
3
+ metadata.gz: '088ba275c0027e5f4a816a681bac8f0ff08d9d9c'
4
+ data.tar.gz: 61f2d2e2e8a2557eb18a045cfb76cbc36d1876dd
5
5
  SHA512:
6
- metadata.gz: c424d21b6c49e55606e26d946ea6df05fd5f860914ba016a8c32da82a63865e74be24ce1f82e14cb787352979960aedaae953093854756df81c6ef57079f7ed5
7
- data.tar.gz: 04ba83211d4a296fda4f109f92439b76e494ee2ac9321a9d46cf1c5cd4d07a5736e86c9217d180438ea360b0f48564ef03d4dfad5caa8e2c9586e096d703adbc
6
+ metadata.gz: e13dfbee846fd28b10f8f5fa04b166efad17269a14537c9dcee8ff50f56353ac740549f2e616d418907bcc83cf37ac80834c1d3c2a26da33ce0acaa632416790
7
+ data.tar.gz: 46c895ce3b5dee436d83887c2d1a028048cc934054d91482c7b3148f6f128d59c9de947ba19cd3a69aef2fc42273579a413257203a7e4ee46b66534acc71866b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.13.3
2
+ - Add transformer class for [Kernel PCA](https://yoshoku.github.io/rumale/doc/Rumale/KernelMachine/KernelPCA.html).
3
+ - Add regressor class for [Kernel Ridge](https://yoshoku.github.io/rumale/doc/Rumale/KernelMachine/KernelRidge.html).
4
+
1
5
  # 0.13.2
2
6
  - Add preprocessing class for label binarization.
3
7
  - Fix to use LabelBinarizer instead of OneHotEncoder.
data/README.md CHANGED
@@ -11,10 +11,10 @@
11
11
  Rumale (**Ru**by **ma**chine **le**arning) is a machine learning library in Ruby.
12
12
  Rumale provides machine learning algorithms with interfaces similar to Scikit-Learn in Python.
13
13
  Rumale supports Linear / Kernel Support Vector Machine,
14
- Logistic Regression, Linear Regression, Ridge, Lasso, Factorization Machine,
14
+ Logistic Regression, Linear Regression, Ridge, Lasso, Kernel Ridge, Factorization Machine,
15
15
  Naive Bayes, Decision Tree, AdaBoost, Gradient Tree Boosting, Random Forest, Extra-Trees, K-nearest neighbor classifier,
16
16
  K-Means, K-Medoids, Gaussian Mixture Model, DBSCAN, SNN, Power Iteration Clustering,
17
- Mutidimensional Scaling, t-SNE, Principal Component Analysis, and Non-negative Matrix Factorization.
17
+ Mutidimensional Scaling, t-SNE, Principal Component Analysis, Kernel PCA and Non-negative Matrix Factorization.
18
18
 
19
19
  This project was formerly known as "SVMKit".
20
20
  If you are using SVMKit, please install Rumale and replace `SVMKit` constants with `Rumale`.
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rumale/base/base_estimator'
4
+ require 'rumale/base/transformer'
5
+
6
+ module Rumale
7
+ module KernelMachine
8
+ # KernelPCA is a class that implements Kernel Principal Component Analysis.
9
+ #
10
+ # @example
11
+ # kernel_mat_train = Rumale::PairwiseMetric::rbf_kernel(training_samples)
12
+ # kpca = Rumale::KernelMachine::KernelPCA(n_components: 2)
13
+ # mapped_traininig_samples = kpca.fit_transform(kernel_mat_train)
14
+ #
15
+ # kernel_mat_test = Rumale::PairwiseMetric::rbf_kernel(test_samples, training_samples)
16
+ # mapped_test_samples = kpca.transform(kernel_mat_test)
17
+ #
18
+ # *Reference*
19
+ # - B. Scholkopf, A. Smola, and K-R. Muller, "Nonlinear Component Analysis as a Kernel Eigenvalue Problem," Neural Computation, Vol. 10 (5), pp. 1299--1319, 1998.
20
+ class KernelPCA
21
+ include Base::BaseEstimator
22
+ include Base::Transformer
23
+
24
+ # Returns the eigenvalues of the centered kernel matrix.
25
+ # @return [Numo::DFloat] (shape: [n_components])
26
+ attr_reader :lambdas
27
+
28
+ # Returns the eigenvectros of the centered kernel matrix.
29
+ # @return [Numo::DFloat] (shape: [n_training_sampes, n_components])
30
+ attr_reader :alphas
31
+
32
+ # Create a new transformer with Kernel PCA.
33
+ #
34
+ # @param n_components [Integer] The number of components.
35
+ def initialize(n_components: 2)
36
+ check_params_integer(n_components: n_components)
37
+ @params = {}
38
+ @params[:n_components] = n_components
39
+ @alphas = nil
40
+ @lambdas = nil
41
+ @row_mean = nil
42
+ @all_mean = nil
43
+ end
44
+
45
+ # Fit the model with given training data.
46
+ # To execute this method, Numo::Linalg must be loaded.
47
+ #
48
+ # @overload fit(x) -> KernelPCA
49
+ # @param x [Numo::DFloat] (shape: [n_training_samples, n_training_samples])
50
+ # The kernel matrix of the training data to be used for fitting the model.
51
+ # @return [KernelPCA] The learned transformer itself.
52
+ def fit(x, _y = nil)
53
+ check_sample_array(x)
54
+ raise ArgumentError, 'Expect the kernel matrix of training data to be square.' unless x.shape[0] == x.shape[1]
55
+ raise 'KernelPCA#fit requires Numo::Linalg but that is not loaded.' unless enable_linalg?
56
+
57
+ n_samples = x.shape[0]
58
+ @row_mean = x.mean(0)
59
+ @all_mean = @row_mean.sum.fdiv(n_samples)
60
+ centered_kernel_mat = x - x.mean(1).expand_dims(1) - @row_mean + @all_mean
61
+ eig_vals, eig_vecs = Numo::Linalg.eigh(centered_kernel_mat, vals_range: (n_samples - @params[:n_components])...n_samples)
62
+ @alphas = eig_vecs.reverse(1).dup
63
+ @lambdas = eig_vals.reverse.dup
64
+ self
65
+ end
66
+
67
+ # Fit the model with training data, and then transform them with the learned model.
68
+ # To execute this method, Numo::Linalg must be loaded.
69
+ #
70
+ # @overload fit_transform(x) -> Numo::DFloat
71
+ # @param x [Numo::DFloat] (shape: [n_samples, n_samples])
72
+ # The kernel matrix of the training data to be used for fitting the model and transformed.
73
+ # @return [Numo::DFloat] (shape: [n_samples, n_components]) The transformed data
74
+ def fit_transform(x, _y = nil)
75
+ check_sample_array(x)
76
+ fit(x).transform(x)
77
+ end
78
+
79
+ # Transform the given data with the learned model.
80
+ #
81
+ # @param x [Numo::DFloat] (shape: [n_testing_samples, n_training_samples])
82
+ # The kernel matrix between testing samples and training samples to be transformed.
83
+ # @return [Numo::DFloat] (shape: [n_testing_samples, n_components]) The transformed data.
84
+ def transform(x)
85
+ check_sample_array(x)
86
+ col_mean = x.sum(1) / @row_mean.shape[0]
87
+ centered_kernel_mat = x - col_mean.expand_dims(1) - @row_mean + @all_mean
88
+ transform_mat = @alphas.dot((1.0 / Numo::NMath.sqrt(@lambdas)).diag)
89
+ transformed = centered_kernel_mat.dot(transform_mat)
90
+ @params[:n_components] == 1 ? transformed[true, 0].dup : transformed
91
+ end
92
+
93
+ # Dump marshal data.
94
+ # @return [Hash] The marshal data.
95
+ def marshal_dump
96
+ { params: @params,
97
+ row_mean: @row_mean,
98
+ all_mean: @all_mean,
99
+ alphas: @alphas,
100
+ lambdas: @lambdas }
101
+ end
102
+
103
+ # Load marshal data.
104
+ # @return [nil]
105
+ def marshal_load(obj)
106
+ @params = obj[:params]
107
+ @row_mean = obj[:row_mean]
108
+ @all_mean = obj[:all_mean]
109
+ @alphas = obj[:alphas]
110
+ @lambdas = obj[:lambdas]
111
+ nil
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rumale/base/base_estimator'
4
+ require 'rumale/base/regressor'
5
+
6
+ module Rumale
7
+ module KernelMachine
8
+ # KernelRidge is a class that implements kernel ridge regression.
9
+ #
10
+ # @example
11
+ # kernel_mat_train = Rumale::PairwiseMetric::rbf_kernel(training_samples)
12
+ # kridge = Rumale::KernelMachine::KernelRidge.new(reg_param: 1.0)
13
+ # kridge.fit(kernel_mat_train, traininig_values)
14
+ #
15
+ # kernel_mat_test = Rumale::PairwiseMetric::rbf_kernel(test_samples, training_samples)
16
+ # results = kridge.predict(kernel_mat_test)
17
+ class KernelRidge
18
+ include Base::BaseEstimator
19
+ include Base::Regressor
20
+
21
+ # Return the weight vector.
22
+ # @return [Numo::DFloat] (shape: [n_training_sample, n_outputs])
23
+ attr_reader :weight_vec
24
+
25
+ # Create a new regressor with kernel ridge regression.
26
+ #
27
+ # @param reg_param [Float/Numo::DFloat] The regularization parameter.
28
+ def initialize(reg_param: 1.0)
29
+ raise TypeError, 'Expect class of reg_param to be Float or Numo::DFloat' unless reg_param.is_a?(Float) || reg_param.is_a?(Numo::DFloat)
30
+ raise ArgumentError, 'Expect reg_param array to be 1-D arrray' if reg_param.is_a?(Numo::DFloat) && reg_param.shape.size != 1
31
+ @params = {}
32
+ @params[:reg_param] = reg_param
33
+ @weight_vec = nil
34
+ end
35
+
36
+ # Fit the model with given training data.
37
+ #
38
+ # @param x [Numo::DFloat] (shape: [n_training_samples, n_training_samples])
39
+ # The kernel matrix of the training data to be used for fitting the model.
40
+ # @param y [Numo::DFloat] (shape: [n_samples, n_outputs]) The taget values to be used for fitting the model.
41
+ # @return [KernelRidge] The learned regressor itself.
42
+ def fit(x, y)
43
+ check_sample_array(x)
44
+ check_tvalue_array(y)
45
+ check_sample_tvalue_size(x, y)
46
+ raise ArgumentError, 'Expect the kernel matrix of training data to be square.' unless x.shape[0] == x.shape[1]
47
+ raise 'KernelRidge#fit requires Numo::Linalg but that is not loaded.' unless enable_linalg?
48
+
49
+ n_samples = x.shape[0]
50
+
51
+ if @params[:reg_param].is_a?(Float)
52
+ reg_kernel_mat = x + Numo::DFloat.eye(n_samples) * @params[:reg_param]
53
+ @weight_vec = Numo::Linalg.solve(reg_kernel_mat, y, driver: 'sym')
54
+ else
55
+ raise ArgumentError, 'Expect y and reg_param to have the same number of elements.' unless y.shape[1] == @params[:reg_param].shape[0]
56
+ n_outputs = y.shape[1]
57
+ @weight_vec = Numo::DFloat.zeros(n_samples, n_outputs)
58
+ n_outputs.times do |n|
59
+ reg_kernel_mat = x + Numo::DFloat.eye(n_samples) * @params[:reg_param][n]
60
+ @weight_vec[true, n] = Numo::Linalg.solve(reg_kernel_mat, y[true, n], driver: 'sym')
61
+ end
62
+ end
63
+
64
+ self
65
+ end
66
+
67
+ # Predict values for samples.
68
+ #
69
+ # @param x [Numo::DFloat] (shape: [n_testing_samples, n_training_samples])
70
+ # The kernel matrix between testing samples and training samples to predict values.
71
+ # @return [Numo::DFloat] (shape: [n_samples, n_outputs]) Predicted values per sample.
72
+ def predict(x)
73
+ check_sample_array(x)
74
+ x.dot(@weight_vec)
75
+ end
76
+
77
+ # Dump marshal data.
78
+ # @return [Hash] The marshal data.
79
+ def marshal_dump
80
+ { params: @params,
81
+ weight_vec: @weight_vec }
82
+ end
83
+
84
+ # Load marshal data.
85
+ # @return [nil]
86
+ def marshal_load(obj)
87
+ @params = obj[:params]
88
+ @weight_vec = obj[:weight_vec]
89
+ nil
90
+ end
91
+ end
92
+ end
93
+ end
@@ -3,5 +3,5 @@
3
3
  # Rumale is a machine learning library in Ruby.
4
4
  module Rumale
5
5
  # The version of Rumale you are using.
6
- VERSION = '0.13.2'
6
+ VERSION = '0.13.3'
7
7
  end
data/lib/rumale.rb CHANGED
@@ -34,6 +34,8 @@ require 'rumale/linear_model/linear_regression'
34
34
  require 'rumale/linear_model/ridge'
35
35
  require 'rumale/linear_model/lasso'
36
36
  require 'rumale/kernel_machine/kernel_svc'
37
+ require 'rumale/kernel_machine/kernel_pca'
38
+ require 'rumale/kernel_machine/kernel_ridge'
37
39
  require 'rumale/polynomial_model/base_factorization_machine'
38
40
  require 'rumale/polynomial_model/factorization_machine_classifier'
39
41
  require 'rumale/polynomial_model/factorization_machine_regressor'
data/rumale.gemspec CHANGED
@@ -17,10 +17,10 @@ Gem::Specification.new do |spec|
17
17
  Rumale is a machine learning library in Ruby.
18
18
  Rumale provides machine learning algorithms with interfaces similar to Scikit-Learn in Python.
19
19
  Rumale currently supports Linear / Kernel Support Vector Machine,
20
- Logistic Regression, Linear Regression, Ridge, Lasso, Factorization Machine,
20
+ Logistic Regression, Linear Regression, Ridge, Lasso, Kernel Ridge, Factorization Machine,
21
21
  Naive Bayes, Decision Tree, AdaBoost, Gradient Tree Boosting, Random Forest, Extra-Trees, K-nearest neighbor algorithm,
22
22
  K-Means, K-Medoids, Gaussian Mixture Model, DBSCAN, SNN, Power Iteration Clustering,
23
- Multidimensional Scaling, t-SNE, Principal Component Analysis, and Non-negative Matrix Factorization.
23
+ Multidimensional Scaling, t-SNE, Principal Component Analysis, Kernel PCA, and Non-negative Matrix Factorization.
24
24
  MSG
25
25
  spec.homepage = 'https://github.com/yoshoku/rumale'
26
26
  spec.license = 'BSD-2-Clause'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rumale
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.2
4
+ version: 0.13.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - yoshoku
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-06 00:00:00.000000000 Z
11
+ date: 2019-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: numo-narray
@@ -126,10 +126,10 @@ description: |
126
126
  Rumale is a machine learning library in Ruby.
127
127
  Rumale provides machine learning algorithms with interfaces similar to Scikit-Learn in Python.
128
128
  Rumale currently supports Linear / Kernel Support Vector Machine,
129
- Logistic Regression, Linear Regression, Ridge, Lasso, Factorization Machine,
129
+ Logistic Regression, Linear Regression, Ridge, Lasso, Kernel Ridge, Factorization Machine,
130
130
  Naive Bayes, Decision Tree, AdaBoost, Gradient Tree Boosting, Random Forest, Extra-Trees, K-nearest neighbor algorithm,
131
131
  K-Means, K-Medoids, Gaussian Mixture Model, DBSCAN, SNN, Power Iteration Clustering,
132
- Multidimensional Scaling, t-SNE, Principal Component Analysis, and Non-negative Matrix Factorization.
132
+ Multidimensional Scaling, t-SNE, Principal Component Analysis, Kernel PCA, and Non-negative Matrix Factorization.
133
133
  email:
134
134
  - yoshoku@outlook.com
135
135
  executables: []
@@ -196,6 +196,8 @@ files:
196
196
  - lib/rumale/evaluation_measure/recall.rb
197
197
  - lib/rumale/evaluation_measure/roc_auc.rb
198
198
  - lib/rumale/kernel_approximation/rbf.rb
199
+ - lib/rumale/kernel_machine/kernel_pca.rb
200
+ - lib/rumale/kernel_machine/kernel_ridge.rb
199
201
  - lib/rumale/kernel_machine/kernel_svc.rb
200
202
  - lib/rumale/linear_model/base_linear_model.rb
201
203
  - lib/rumale/linear_model/lasso.rb