lib/rumale/kernel_machine/kernel_pca.rb in rumale-0.18.3 vs lib/rumale/kernel_machine/kernel_pca.rb in rumale-0.18.4

- old
+ new

@@ -9,11 +9,11 @@ # # @example # require 'numo/linalg/autoloader' # # kernel_mat_train = Rumale::PairwiseMetric::rbf_kernel(training_samples) - # kpca = Rumale::KernelMachine::KernelPCA(n_components: 2) + # kpca = Rumale::KernelMachine::KernelPCA.new(n_components: 2) # mapped_traininig_samples = kpca.fit_transform(kernel_mat_train) # # kernel_mat_test = Rumale::PairwiseMetric::rbf_kernel(test_samples, training_samples) # mapped_test_samples = kpca.transform(kernel_mat_test) # @@ -25,11 +25,11 @@ # Returns the eigenvalues of the centered kernel matrix. # @return [Numo::DFloat] (shape: [n_components]) attr_reader :lambdas - # Returns the eigenvectros of the centered kernel matrix. + # Returns the eigenvectors of the centered kernel matrix. # @return [Numo::DFloat] (shape: [n_training_sampes, n_components]) attr_reader :alphas # Create a new transformer with Kernel PCA. # @@ -38,10 +38,11 @@ check_params_numeric(n_components: n_components) @params = {} @params[:n_components] = n_components @alphas = nil @lambdas = nil + @transform_mat = nil @row_mean = nil @all_mean = nil end # Fit the model with given training data. @@ -61,10 +62,11 @@ @all_mean = @row_mean.sum.fdiv(n_samples) centered_kernel_mat = x - x.mean(1).expand_dims(1) - @row_mean + @all_mean eig_vals, eig_vecs = Numo::Linalg.eigh(centered_kernel_mat, vals_range: (n_samples - @params[:n_components])...n_samples) @alphas = eig_vecs.reverse(1).dup @lambdas = eig_vals.reverse.dup + @transform_mat = @alphas.dot((1.0 / Numo::NMath.sqrt(@lambdas)).diag) self end # Fit the model with training data, and then transform them with the learned model. # To execute this method, Numo::Linalg must be loaded. @@ -85,11 +87,10 @@ # @return [Numo::DFloat] (shape: [n_testing_samples, n_components]) The transformed data. def transform(x) x = check_convert_sample_array(x) col_mean = x.sum(1) / @row_mean.shape[0] centered_kernel_mat = x - col_mean.expand_dims(1) - @row_mean + @all_mean - transform_mat = @alphas.dot((1.0 / Numo::NMath.sqrt(@lambdas)).diag) - transformed = centered_kernel_mat.dot(transform_mat) + transformed = centered_kernel_mat.dot(@transform_mat) @params[:n_components] == 1 ? transformed[true, 0].dup : transformed end end end end