[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Probability distributions library in Ruby

Libra

4/12/2007 9:55:00 PM

Hello,

I would extract some numbers according to a given
probability distribution (at least, Normal, Exponential,
Poisson and Bernoulli).

Do you know if a similar library already exists in Ruby? I
only found pseudo-random number generator.

TIA

Libra
6 Answers

szymon.rozga

4/12/2007 10:31:00 PM

0

If you don't find any library, you can always write your own using the
technique outlined in section 1.3 of this paper.
http://eeyore.ucdavis.edu/stat1...

Basically given the CDF F of some distribution (say, Poisson), you can
generate random numbers from the Poisson distribution by doing:
u = rand # uniformely generated random number
y = Finv(u)

-Szymon

On Apr 12, 5:54 pm, Libra <libraramaANTIS...@gmail.com> wrote:
> Hello,
>
> I would extract some numbers according to a given
> probability distribution (at least, Normal, Exponential,
> Poisson and Bernoulli).
>
> Do you know if a similar library already exists in Ruby? I
> only found pseudo-random number generator.
>
> TIA
>
> Libra


Alex Gutteridge

4/13/2007 12:36:00 AM

0

On 13 Apr 2007, at 06:55, Libra wrote:

> Hello,
>
> I would extract some numbers according to a given probability
> distribution (at least, Normal, Exponential, Poisson and Bernoulli).
>
> Do you know if a similar library already exists in Ruby? I only
> found pseudo-random number generator.
>
> TIA
>
> Libra

If you are comfortable with R, you can use RSRuby (http://
web.kuicr.kyoto-u.ac.jp/~alexg/rsruby/) to generate numbers from any
its distribution functions. For example, extracting 10 numbers from a
normal distribution with mean 0:

[alexg@powerbook]/Users/alexg(1): irb -rubygems
irb(main):001:0> require 'rsruby'
=> true
irb(main):002:0> r = RSRuby.instance
=> #<RSRuby:0x1c1510>
irb(main):003:0> r.rnorm(10)
=> [-0.418488870801272, 3.8442920287686, -2.23915973195997,
-1.1852964455658, 0.292187794718865, -0.0538355720349994,
-0.682675725085902, -0.179593328583021, 0.617238096715829,
-0.353627801112474]

The default R stats package has the following distributions built in
and you can use any R library to add more (I couldn't see Bernoulli
in this list, but maybe it has an alternative name?):

Beta(stats) The Beta Distribution
Binomial(stats) The Binomial Distribution
Cauchy(stats) The Cauchy Distribution
Chisquare(stats) The (non-central) Chi-Squared Distribution
Exponential(stats) The Exponential Distribution
FDist(stats) The F Distribution
GammaDist(stats) The Gamma Distribution
Geometric(stats) The Geometric Distribution
Hypergeometric(stats) The Hypergeometric Distribution
Logistic(stats) The Logistic Distribution
Lognormal(stats) The Log Normal Distribution
Multinomial(stats) The Multinomial Distribution
NegBinomial(stats) The Negative Binomial Distribution
Normal(stats) The Normal Distribution
Poisson(stats) The Poisson Distribution
SignRank(stats) Distribution of the Wilcoxon Signed Rank
Statistic
TDist(stats) The Student t Distribution
Tukey(stats) The Studentized Range Distribution
Uniform(stats) The Uniform Distribution
Weibull(stats) The Weibull Distribution
Wilcoxon(stats) Distribution of the Wilcoxon Rank Sum Statistic
ecdf(stats) Empirical Cumulative Distribution Function
survreg.distributions(survival)
Parametric Survival Distributions

Alex Gutteridge

Bioinformatics Center
Kyoto University



Alex Gutteridge

4/13/2007 12:50:00 AM

0

On 13 Apr 2007, at 09:35, Alex Gutteridge wrote:

> On 13 Apr 2007, at 06:55, Libra wrote:
>
>> Hello,
>>
>> I would extract some numbers according to a given probability
>> distribution (at least, Normal, Exponential, Poisson and Bernoulli).
>>
>> Do you know if a similar library already exists in Ruby? I only
>> found pseudo-random number generator.
>>
>> TIA
>>
>> Libra
>
> If you are comfortable with R, you can use RSRuby (http://
> web.kuicr.kyoto-u.ac.jp/~alexg/rsruby/) to generate numbers from
> any its distribution functions.

A quick bit of googling found the missing Bernoulli distribution
function:

http://rss.acs.unt.edu/Rdoc/library/Rlab/html/Bern...

It seems to be part of a CRAN package called Rlab:

http://cran.r-project.org/src/contrib/Descriptions...

You should be able to install and then access this library through
RSRuby to get your complete set of functions.

Alex Gutteridge

Bioinformatics Center
Kyoto University



maw

4/15/2007 12:13:00 PM

0

Libra wrote:
> Hello,
>
> I would extract some numbers according to a given probability
> distribution (at least, Normal, Exponential, Poisson and Bernoulli).
>
> Do you know if a similar library already exists in Ruby? I only found
> pseudo-random number generator.
>
> TIA
>
> Libra
R is great! maybe too great for your requirements
rb-gsl is easy

for example this will print you a nice gauss-shape graph
from rb-gsl-1.8.3/samples/histogram/gauss.rb
> #!/usr/bin/env ruby
> require("gsl")
>
> N = 10000
> MAX = 8
> rng = Rng.alloc(2)
>
> data = Ran.gaussian(rng, 1.5, N) + 2
> h = GSL::Histogram.alloc(100, [-MAX, MAX])
> h.increment(data)
>
> sigma, mean, height, = h.fit_gaussian
>
> x = GSL::Vector.linspace(-MAX, MAX, 100)
> y = height*Ran::gaussian_pdf(x-mean, sigma)
> GSL::graph(h, [x, y], "-T X -C -g 3")

NICE!

cauchy exponential power poisson etc. also available
ruby - making maths easy

Roger Pack

8/23/2007 9:56:00 PM

0

From wikipedia : algorithm for generating pseudo poissons:

def poisson(lambda)

# init
l = Math.exp(-lambda)
k = 0
p = 1
while p >= l
k += 1
u = rand
p = p *u
end
return k -1
end

only returns ints, but hey, they center around lambda
gl.
-Roger

maw wrote:
> Libra wrote:
>> Libra
> R is great! maybe too great for your requirements
> rb-gsl is easy
>
> for example this will print you a nice gauss-shape graph
> from rb-gsl-1.8.3/samples/histogram/gauss.rb
>>
>> sigma, mean, height, = h.fit_gaussian
>>
>> x = GSL::Vector.linspace(-MAX, MAX, 100)
>> y = height*Ran::gaussian_pdf(x-mean, sigma)
>> GSL::graph(h, [x, y], "-T X -C -g 3")
>
> NICE!
>
> cauchy exponential power poisson etc. also available
> ruby - making maths easy

--
Posted via http://www.ruby-....

M. Edward (Ed) Borasky

8/25/2007 4:06:00 AM

0

Roger Pack wrote:
>>From wikipedia : algorithm for generating pseudo poissons:
>
> def poisson(lambda)
>
> # init
> l = Math.exp(-lambda)
> k = 0
> p = 1
> while p >= l
> k += 1
> u = rand
> p = p *u
> end
> return k -1
> end
>
> only returns ints, but hey, they center around lambda
> gl.
> -Roger
>
> maw wrote:
>> Libra wrote:
>>> Libra
>> R is great! maybe too great for your requirements
>> rb-gsl is easy
>>
>> for example this will print you a nice gauss-shape graph
>> from rb-gsl-1.8.3/samples/histogram/gauss.rb
>>> sigma, mean, height, = h.fit_gaussian
>>>
>>> x = GSL::Vector.linspace(-MAX, MAX, 100)
>>> y = height*Ran::gaussian_pdf(x-mean, sigma)
>>> GSL::graph(h, [x, y], "-T X -C -g 3")
>> NICE!
>>
>> cauchy exponential power poisson etc. also available
>> ruby - making maths easy
>

There is also RSRuby, a way of calling the R libraries, including their
probability distribution routines, from Ruby. I don't know anything
about the ones in GSL, but I know the algorithms in R are first-rate,
and I wouldn't code my own no matter *how* bored I got. :)