Skip to content

Instantly share code, notes, and snippets.

@bjpcjp
Forked from rweald/denominator-snippet.rb
Created September 12, 2012 01:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bjpcjp/3703506 to your computer and use it in GitHub Desktop.
Save bjpcjp/3703506 to your computer and use it in GitHub Desktop.
Code Snippets for Simple Linear Regression Using Ruby Blog Post
denominator = @xs.reduce(0) do |sum, x|
sum + ((x - x_mean) ** 2)
end
class SimpleLinearRegression
def initialize(xs, ys)
@xs, @ys = xs, ys
if @xs.length != @ys.length
raise "Unbalanced data. xs need to be same length as ys"
end
end
def y_intercept
mean(@ys) - (slope * mean(@xs))
end
def slope
x_mean = mean(@xs)
y_mean = mean(@ys)
numerator = (0...@xs.length).reduce(0) do |sum, i|
sum + ((@xs[i] - x_mean) * (@ys[i] - y_mean))
end
denominator = @xs.reduce(0) do |sum, x|
sum + ((x - x_mean) ** 2)
end
(numerator / denominator)
end
def mean(values)
total = values.reduce(0) { |sum, x| x + sum }
Float(total) / Float(values.length)
end
end
x_mean = mean(xs)
y_mean = mean(ys)
numerator = (0...@xs.length).reduce(0) do |sum, i|
sum + ((@xs[i] - x_mean) * (@ys[i] - y_mean))
end
data <- read.csv("path to csv")
lm(Number.of.Views ~ Days.Online, data = data)
require_relative 'simple-linear-regression'
data_file = File.open(ARGV[0])
data_file.readline # strip off the header
xs, ys = [], []
data_file.each do |line|
x, y = line.split(",")
xs << Float(x)
ys << Float(y)
end
linear_model = SimpleLinearRegression.new(xs, ys)
puts "Model generated with"
puts "Slope: #{linear_model.slope}"
puts "Y-Intercept: #{linear_model.y_intercept}"
puts "\n"
puts "Estimated Linear Model:"
puts "Y = #{linear_model.y_intercept} + (#{linear_model.slope} * X)"
class SimpleLinearRegression
def mean(values)
total = values.reduce(0) { |sum, x| x + sum }
Float(total) / Float(values.length)
end
end
class SimpleLinearRegression
def initialize(xs, ys)
@xs, @ys = xs, ys
if @xs.length != @ys.length
raise "Unbalanced data. xs need to be same length as ys"
end
end
def slope
x_mean = mean(@xs)
y_mean = mean(@ys)
numerator = (0...@xs.length).reduce(0) do |sum, i|
sum + ((@xs[i] - x_mean) * (@ys[i] - y_mean))
end
denominator = @xs.reduce(0) do |sum, x|
sum + ((x - x_mean) ** 2)
end
(numerator / denominator)
end
#Code truncated for clarity
end
def y_intercept
mean(@ys) - (slope * mean(@xs))
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment