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