class Uranai::LinearRegression
Attributes
data[R]
Public Class Methods
new(csv)
click to toggle source
# File lib/uranai/linear_regression.rb, line 7 def initialize(csv) @data = Uranai::Data.new(csv) end
Public Instance Methods
compute_cost(theta: default_theta)
click to toggle source
# File lib/uranai/linear_regression.rb, line 11 def compute_cost(theta: default_theta) matrix_theta = matrix_theta(theta) ((matrix_x * matrix_theta) - matrix_y) .map { |element| element ** 2 } .inject(0.0) { |sum,i| sum + i } ./ (2 * data.training_example_size) end
fitting_params_with_gradient_descent(options = {})
click to toggle source
# File lib/uranai/linear_regression.rb, line 19 def fitting_params_with_gradient_descent(options = {}) options.keep_if { |k,_| [:alpha, :num_iters, :theta, :normalize].include?(k) } FittingParameter.new(gradient_descent(options)) end
Also aliased as: fitting_params
fitting_params_with_normal_equations()
click to toggle source
# File lib/uranai/linear_regression.rb, line 25 def fitting_params_with_normal_equations FittingParameter.new(normal_equations) end
Private Instance Methods
default_theta()
click to toggle source
# File lib/uranai/linear_regression.rb, line 33 def default_theta [[0] * data.column_size] end
gradient_descent(alpha: 0.01, num_iters: 1500, theta: default_theta, normalize: false)
click to toggle source
TODO: Add an option for normalizing feature data (x data)
# File lib/uranai/linear_regression.rb, line 62 def gradient_descent(alpha: 0.01, num_iters: 1500, theta: default_theta, normalize: false) matrix_theta = matrix_theta(theta) x = normalize ? normalized_matrix_x : matrix_x num_iters.times do matrix_theta -= (x.transpose * ((x * matrix_theta) - matrix_y)) * (alpha / training_example_size) end matrix_theta.to_a.flatten end
matrix_theta(theta)
click to toggle source
# File lib/uranai/linear_regression.rb, line 53 def matrix_theta(theta) Matrix.columns(normalize_theta(theta)) end
matrix_x()
click to toggle source
# File lib/uranai/linear_regression.rb, line 41 def matrix_x data.matrix_x end
matrix_y()
click to toggle source
# File lib/uranai/linear_regression.rb, line 49 def matrix_y data.matrix_y end
normal_equations()
click to toggle source
# File lib/uranai/linear_regression.rb, line 72 def normal_equations ((matrix_x.transpose * matrix_x).inverse * matrix_x.transpose * matrix_y) .to_a.flatten end
normalize_theta(theta)
click to toggle source
# File lib/uranai/linear_regression.rb, line 37 def normalize_theta(theta) [theta.flatten] end
normalized_matrix_x()
click to toggle source
# File lib/uranai/linear_regression.rb, line 45 def normalized_matrix_x data.normalized_matrix_x end
training_example_size()
click to toggle source
# File lib/uranai/linear_regression.rb, line 57 def training_example_size data.training_example_size end