Class: Rumale::Decomposition::PCA
- Inherits:
-
Object
- Object
- Rumale::Decomposition::PCA
- Includes:
- Base::BaseEstimator, Base::Transformer
- Defined in:
- lib/rumale/decomposition/pca.rb
Overview
PCA is a class that implements Principal Component Analysis.
Reference
-
Sharma and K K. Paliwal, “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 included from Base::BaseEstimator
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: 'fpt', 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.
-
#marshal_dump ⇒ Hash
Dump marshal data.
-
#marshal_load(obj) ⇒ nil
Load marshal data.
-
#transform(x) ⇒ Numo::DFloat
Transform the given data with the learned model.
Constructor Details
#initialize(n_components: 2, solver: 'fpt', max_iter: 100, tol: 1.0e-4, random_seed: nil) ⇒ PCA
Create a new transformer with PCA.
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/rumale/decomposition/pca.rb', line 46 def initialize(n_components: 2, solver: 'fpt', max_iter: 100, tol: 1.0e-4, random_seed: nil) check_params_integer(n_components: n_components, max_iter: max_iter) check_params_string(solver: solver) check_params_float(tol: tol) check_params_type_or_nil(Integer, random_seed: random_seed) check_params_positive(n_components: n_components, max_iter: max_iter, tol: tol) @params = {} @params[:solver] = solver != 'evd' ? 'fpt' : 'evd' @params[:n_components] = n_components @params[:max_iter] = max_iter @params[:tol] = tol @params[:random_seed] = random_seed @params[:random_seed] ||= srand @components = nil @mean = nil @rng = Random.new(@params[:random_seed]) end |
Instance Attribute Details
#components ⇒ Numo::DFloat (readonly)
Returns the principal components.
28 29 30 |
# File 'lib/rumale/decomposition/pca.rb', line 28 def components @components end |
#mean ⇒ Numo::DFloat (readonly)
Returns the mean vector.
32 33 34 |
# File 'lib/rumale/decomposition/pca.rb', line 32 def mean @mean end |
#rng ⇒ Random (readonly)
Return the random generator.
36 37 38 |
# File 'lib/rumale/decomposition/pca.rb', line 36 def rng @rng end |
Instance Method Details
#fit(x) ⇒ PCA
Fit the model with given training data.
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/rumale/decomposition/pca.rb', line 70 def fit(x, _y = nil) check_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.
105 106 107 108 |
# File 'lib/rumale/decomposition/pca.rb', line 105 def fit_transform(x, _y = nil) check_sample_array(x) fit(x).transform(x) end |
#inverse_transform(z) ⇒ Numo::DFloat
Inverse transform the given transformed data with the learned model.
123 124 125 126 127 |
# File 'lib/rumale/decomposition/pca.rb', line 123 def inverse_transform(z) check_sample_array(z) c = @components.shape[1].nil? ? @components.(0) : @components z.dot(c) + @mean end |
#marshal_dump ⇒ Hash
Dump marshal data.
131 132 133 134 135 136 |
# File 'lib/rumale/decomposition/pca.rb', line 131 def marshal_dump { params: @params, components: @components, mean: @mean, rng: @rng } end |
#marshal_load(obj) ⇒ nil
Load marshal data.
140 141 142 143 144 145 146 |
# File 'lib/rumale/decomposition/pca.rb', line 140 def marshal_load(obj) @params = obj[:params] @components = obj[:components] @mean = obj[:mean] @rng = obj[:rng] nil end |
#transform(x) ⇒ Numo::DFloat
Transform the given data with the learned model.
114 115 116 117 |
# File 'lib/rumale/decomposition/pca.rb', line 114 def transform(x) check_sample_array(x) (x - @mean).dot(@components.transpose) end |