class Callidus::ExponentialRegression

Attributes

a[R]
b[R]
correlation[R]
input[RW]
output[RW]
predicted_output[RW]
standard_error[R]

Public Class Methods

new(ip = [], op = []) click to toggle source
# File lib/src/ExponentialRegression.rb, line 15
def initialize(ip = [], op = [])
    @input = ip
    @output = op

    @trained = false
end

Public Instance Methods

find_standard_error() click to toggle source
# File lib/src/ExponentialRegression.rb, line 67
def find_standard_error
    assert_trained()

    n = @input.size > @output.size ? @output.size : @input.size

    diffs = []

    n.times do |i|
        diffs << (@predicted_output[i] - @output[i]) ** 2
    end

    @standard_error = (Math.sqrt(diffs.sum/(n - 2.0))).round(3)

    self
end
formatted() click to toggle source
# File lib/src/ExponentialRegression.rb, line 28
def formatted
    assert_trained()

    "f(x) = #{@a}e^#{@b}x"
end
predict(x) click to toggle source
# File lib/src/ExponentialRegression.rb, line 83
def predict(x)
    assert_trained()

    @a * (2.7182818284590452353602 ** (@b * x))
end
train() click to toggle source
# File lib/src/ExponentialRegression.rb, line 34
def train
    mean_x = @input.mean
    mean_lny = @output.inject(0.0) { |s, n|  s + Math.log(n) } / @output.size

    sum_xx = 0.0
    sum_xy = 0.0
    sum_yy = 0.0

    @input.each_index do |i|
        sum_xx += @input[i] * @input[i]
        sum_xy += @input[i] * Math.log(@output[i])
        sum_yy += Math.log(@output[i]) * Math.log(@output[i])
    end

    sum_xx = (sum_xx / @input.size) - (mean_x * mean_x)
    sum_xy = (sum_xy / @input.size) - (mean_x * mean_lny)
    sum_yy = (sum_yy / @output.size) - (mean_lny * mean_lny)

    @b = sum_xy / sum_xx
    @a = 2.7182818284590452353602 ** (mean_lny - b * mean_x)

    @predicted_output = @input.map { |x| (@a * (2.7182818284590452353602 ** (@b * x))).round(3) }

    @correlation = (sum_xy / (Math.sqrt(sum_xx) * Math.sqrt(sum_yy))).round(3)

    @trained = true

    @a = @a.round(3)
    @b = @b.round(3)

    self.find_standard_error
end

Private Instance Methods

assert_trained(method = "train") click to toggle source
# File lib/src/ExponentialRegression.rb, line 22
        def assert_trained(method = "train")
    if !@trained
        raise Util::UntrainedError.new("ExponentialRegression")
    end
end