class PCA
Public Class Methods
new(entries)
click to toggle source
# File lib/principal-components-analysis.rb, line 6 def initialize(entries) @dimension = entries[0].size @entries = Matrix[*entries] conv_m = @entries.covariance_matrix # p conv_m eigen_vectors, eigen_values, v_inv = conv_m.eigensystem @eigen = [] @total_eigenvalue = 0.0 @dimension.times do |i| @eigen << { value: eigen_values[i,i], vector: eigen_vectors.row(i).to_a } @total_eigenvalue += eigen_values[i,i] end @eigen.sort_by!{|v| -v[:value]} end
Public Instance Methods
eigen()
click to toggle source
# File lib/principal-components-analysis.rb, line 22 def eigen @eigen end
reduce(reducing_dimension=1)
click to toggle source
# File lib/principal-components-analysis.rb, line 26 def reduce(reducing_dimension=1) factor_array = [] sum_eigenvalue = 0.0 reducing_dimension.times.each do |i| factor_array << @eigen[i][:vector]#.map{|v| v * @eigen[i][:value] } sum_eigenvalue += @eigen[i][:value] end factor = Matrix[ *factor_array ] reduced_matrix = @entries * factor.t distortion_rate = 1 - (sum_eigenvalue/@total_eigenvalue) return reduced_matrix,distortion_rate end