Class: Rumale::Decomposition::PCA
- Inherits:
-
Base::Estimator
- Object
- Base::Estimator
- Rumale::Decomposition::PCA
- Includes:
- Base::Transformer
- Defined in:
- rumale-decomposition/lib/rumale/decomposition/pca.rb
Overview
PCA is a class that implements Principal Component Analysis.
Reference
-
Sharma, A., and Paliwal, K K., “Fast principal component analysis using fixed-point algorithm,” Pattern Recognition Letters, 28, pp. 1151–1155, 2007.
Instance Attribute Summary collapse
-
#components ⇒ Numo::DFloat
readonly
Returns the principal components.
-
#mean ⇒ Numo::DFloat
readonly
Returns the mean vector.
-
#rng ⇒ Random
readonly
Return the random generator.
Attributes inherited from Base::Estimator
Instance Method Summary collapse
-
#fit(x) ⇒ PCA
Fit the model with given training data.
-
#fit_transform(x) ⇒ Numo::DFloat
Fit the model with training data, and then transform them with the learned model.
-
#initialize(n_components: 2, solver: 'auto', max_iter: 100, tol: 1.0e-4, random_seed: nil) ⇒ PCA
constructor
Create a new transformer with PCA.
-
#inverse_transform(z) ⇒ Numo::DFloat
Inverse transform the given transformed data with the learned model.
-
#transform(x) ⇒ Numo::DFloat
Transform the given data with the learned model.
Constructor Details
#initialize(n_components: 2, solver: 'auto', max_iter: 100, tol: 1.0e-4, random_seed: nil) ⇒ PCA
Create a new transformer with PCA.
58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'rumale-decomposition/lib/rumale/decomposition/pca.rb', line 58 def initialize(n_components: 2, solver: 'auto', max_iter: 100, tol: 1.0e-4, random_seed: nil) super() @params = { n_components: n_components, solver: 'fpt', max_iter: max_iter, tol: tol, random_seed: random_seed || srand } @params[:solver] = 'evd' if (solver == 'auto' && enable_linalg?(warning: false)) || solver == 'evd' @rng = Random.new(@params[:random_seed]) end |
Instance Attribute Details
#components ⇒ Numo::DFloat (readonly)
Returns the principal components.
38 39 40 |
# File 'rumale-decomposition/lib/rumale/decomposition/pca.rb', line 38 def components @components end |
#mean ⇒ Numo::DFloat (readonly)
Returns the mean vector.
42 43 44 |
# File 'rumale-decomposition/lib/rumale/decomposition/pca.rb', line 42 def mean @mean end |
#rng ⇒ Random (readonly)
Return the random generator.
46 47 48 |
# File 'rumale-decomposition/lib/rumale/decomposition/pca.rb', line 46 def rng @rng end |
Instance Method Details
#fit(x) ⇒ PCA
Fit the model with given training data.
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'rumale-decomposition/lib/rumale/decomposition/pca.rb', line 76 def fit(x, _y = nil) x = ::Rumale::Validation.check_convert_sample_array(x) # initialize some variables. @components = nil n_samples, n_features = x.shape sub_rng = @rng.dup # centering. @mean = x.mean(0) centered_x = x - @mean # optimization. covariance_mat = centered_x.transpose.dot(centered_x) / (n_samples - 1) if @params[:solver] == 'evd' && enable_linalg? _, evecs = Numo::Linalg.eigh(covariance_mat, vals_range: (n_features - @params[:n_components])...n_features) comps = evecs.reverse(1).transpose @components = @params[:n_components] == 1 ? comps[0, true].dup : comps.dup else @params[:n_components].times do comp_vec = ::Rumale::Utils.rand_uniform(n_features, sub_rng) @params[:max_iter].times do updated = orthogonalize(covariance_mat.dot(comp_vec)) break if (updated.dot(comp_vec) - 1).abs < @params[:tol] comp_vec = updated end @components = @components.nil? ? comp_vec : Numo::NArray.vstack([@components, comp_vec]) end end self end |
#fit_transform(x) ⇒ Numo::DFloat
Fit the model with training data, and then transform them with the learned model.
112 113 114 115 116 |
# File 'rumale-decomposition/lib/rumale/decomposition/pca.rb', line 112 def fit_transform(x, _y = nil) x = ::Rumale::Validation.check_convert_sample_array(x) fit(x).transform(x) end |
#inverse_transform(z) ⇒ Numo::DFloat
Inverse transform the given transformed data with the learned model.
132 133 134 135 136 137 |
# File 'rumale-decomposition/lib/rumale/decomposition/pca.rb', line 132 def inverse_transform(z) z = ::Rumale::Validation.check_convert_sample_array(z) c = @components.shape[1].nil? ? @components.(0) : @components z.dot(c) + @mean end |
#transform(x) ⇒ Numo::DFloat
Transform the given data with the learned model.
122 123 124 125 126 |
# File 'rumale-decomposition/lib/rumale/decomposition/pca.rb', line 122 def transform(x) x = ::Rumale::Validation.check_convert_sample_array(x) (x - @mean).dot(@components.transpose) end |