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