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(options = {})
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