class Statistics::Distribution::Weibull

Attributes

scale[RW]
shape[RW]

Public Class Methods

new(k, lamb) click to toggle source
# File lib/statistics/distribution/weibull.rb, line 6
def initialize(k, lamb)
  self.shape = k.to_r
  self.scale = lamb.to_r
end

Public Instance Methods

cumulative_function(random_value) click to toggle source
# File lib/statistics/distribution/weibull.rb, line 11
def cumulative_function(random_value)
  return 0 if random_value < 0

  1 - Math.exp(-((random_value/scale) ** shape))
end
density_function(value) click to toggle source
# File lib/statistics/distribution/weibull.rb, line 17
def density_function(value)
  return if shape <= 0 || scale <= 0
  return 0 if value < 0

  left = shape/scale
  center = (value/scale)**(shape - 1)
  right = Math.exp(-((value/scale)**shape))

  left * center * right
end
mean() click to toggle source
# File lib/statistics/distribution/weibull.rb, line 28
def mean
  scale * Math.gamma(1 + (1/shape))
end
mode() click to toggle source
# File lib/statistics/distribution/weibull.rb, line 32
def mode
  return 0 if shape <= 1

  scale * (((shape - 1)/shape) ** (1/shape))
end
random(elements: 1, seed: Random.new_seed) click to toggle source

Using the inverse CDF function, also called quantile, we can calculate a random sample that follows a weibull distribution.

Formula extracted from www.taygeta.com/random/weibull.html

# File lib/statistics/distribution/weibull.rb, line 49
def random(elements: 1, seed: Random.new_seed)
  results = []

  srand(seed)

  elements.times do
    results << ((-1/scale) * Math.log(1 - rand)) ** (1/shape)
  end

  if elements == 1
    results.first
  else
    results
  end
end
variance() click to toggle source
# File lib/statistics/distribution/weibull.rb, line 38
def variance
  left = Math.gamma(1 + (2/shape))
  right = Math.gamma(1 + (1/shape)) ** 2

  (scale ** 2) * (left - right)
end