9.12. Solution Libraries#

9.12.1. likelihood#

  • likelihood.py

    #!/usr/bin/python
    
    from math import exp, log
    
    def exp_pdf (x, tau) :
        '''
        the exponential probability density function
        '''
        if tau == 0. : return 1.
        return exp (-1 * x / tau) / tau
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def likelihood (theta, pdf, sample) :
        '''
        the likelihood function calculated
        for a sample of independent variables idendically distributed 
        according to their pdf with parameter theta
        '''
        risultato = 1.
        for x in sample:
          risultato = risultato * pdf (x, theta)
        return risultato
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def loglikelihood (theta, pdf, sample) :
        '''
        the log-likelihood function calculated
        for a sample of independent variables idendically distributed 
        according to their pdf with parameter theta
        '''
        risultato = 0.
        for x in sample:
          if (pdf (x, theta) > 0.) : risultato = risultato + log (pdf (x, theta))    
        return risultato
    
    
    

9.12.2. myrand#

  • myrand.py

    #!/usr/bin/python
    
    import random
    from math import sqrt
    import numpy as np
    
    
    def generate_uniform (N, seed = 0.) :
        '''
        generazione di N numeri pseudo-casuali distribuiti fra 0 ed 1
        a partire da un determinato seed
        '''
        if seed != 0. : random.seed (float (seed))
        randlist = []
        for i in range (N):
            # Return the next random floating point number in the range 0.0 <= X < 1.0
            randlist.append (random.random ())
        return randlist
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def rand_range (xMin, xMax) :
        '''
        generazione di un numero pseudo-casuale distribuito fra xMin ed xMax
        '''
        return xMin + random.random () * (xMax - xMin)
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def generate_range (xMin, xMax, N, seed = 0.) :
        '''
        generazione di N numeri pseudo-casuali distribuiti fra xMin ed xMax
        a partire da un determinato seed
        '''
        if seed != 0. : random.seed (float (seed))
        randlist = []
        for i in range (N):
            # Return the next random floating point number in the range 0.0 <= X < 1.0
            randlist.append (rand_range (xMin, xMax))
        return randlist
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def rand_TAC (f, xMin, xMax, yMax) :
        '''
        generazione di un numero pseudo-casuale 
        con il metodo try and catch
        '''
        x = rand_range (xMin, xMax)
        y = rand_range (0, yMax)
        while (y > f (x)) :
            x = rand_range (xMin, xMax)
            y = rand_range (0, yMax)
        return x
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def generate_TAC (f, xMin, xMax, yMax, N, seed = 0.) :
        '''
        generazione di N numeri pseudo-casuali
        con il metodo try and catch, in un certo intervallo,
        a partire da un determinato seed
        '''
        if seed != 0. : random.seed (float (seed))
        randlist = []
        for i in range (N):
            # Return the next random floating point number in the range 0.0 <= X < 1.0
            randlist.append (rand_TAC (f, xMin, xMax, yMax))
        return randlist
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def rand_TCL (xMin, xMax, N_sum = 10) :
        '''
        generazione di un numero pseudo-casuale 
        con il metodo del teorema centrale del limite
        su un intervallo fissato
        '''
        y = 0.
        for i in range (N_sum) :
            y = y + rand_range (xMin, xMax)
        y /= N_sum ;
        return y ;
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def generate_TCL (xMin, xMax, N, N_sum = 10, seed = 0.) :
        '''
        generazione di N numeri pseudo-casuali
        con il metodo del teorema centrale del limite, in un certo intervallo,
        a partire da un determinato seed
        '''
        if seed != 0. : random.seed (float (seed))
        randlist = []
        for i in range (N):
            # Return the next random floating point number in the range 0.0 <= X < 1.0
            randlist.append (rand_TCL (xMin, xMax, N_sum))
        return randlist
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def rand_TCL_ms (mean, sigma, N_sum = 10) :
        '''
        generazione di un numero pseudo-casuale 
        con il metodo del teorema centrale del limite
        note media e sigma della gaussiana
        '''
        y = 0.
        delta = sqrt (3 * N_sum) * sigma
        xMin = mean - delta
        xMax = mean + delta
        for i in range (N_sum) :
            y = y + rand_range (xMin, xMax)
        y /= N_sum ;
        return y ;
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def generate_TCL_ms (mean, sigma, N, N_sum = 10, seed = 0.) :
        '''
        generazione di N numeri pseudo-casuali
        con il metodo del teorema centrale del limite, note media e sigma della gaussiana,
        a partire da un determinato seed
        '''
        if seed != 0. : random.seed (float (seed))
        randlist = []
        delta = sqrt (3 * N_sum) * sigma
        xMin = mean - delta
        xMax = mean + delta
        for i in range (N):
            # Return the next random floating point number in the range 0.0 <= X < 1.0
            randlist.append (rand_TCL (xMin, xMax, N_sum))
        return randlist
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def inv_exp (y, lamb = 1) :
        '''
        Inverse of the primitive of the exponential PDF.
        pdf(x) = lambda * exp(-lambda x) x >= 0, 0 otherwise.
        F(x) = int_{0}^{x} pdf(x)dx = 1 - exp(-lambda * x) for x >= 0, 0 otherwise.
        F^{-1}(y) = - (ln(1-y)) / lambda
        '''
        return -1 * np.log (1-y) / lamb
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def rand_exp (tau) :
        '''
        generazione di un numero pseudo-casuale esponenziale
        con il metodo della funzione inversa
        a partire dal tau dell'esponenziale
        '''
        lamb = 1. / tau
        return inv_exp (random.random (), lamb)
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def generate_exp (tau, N, seed = 0.) :
        '''
        generazione di N numeri pseudo-casuali esponenziali
        con il metodo della funzione inversa, noto tau dell'esponenziale,
        a partire da un determinato seed
        '''
        if seed != 0. : random.seed (float (seed))
        randlist = []
        for i in range (N):
            # Return the next random floating point number in the range 0.0 <= X < 1.0
            randlist.append (rand_exp (tau))
        return randlist
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def rand_poisson (mean) :
        '''
        generazione di un numero pseudo-casuale Poissoniano
        a partire da una pdf esponenziale
        '''
        total_time = rand_exp (1.)
        events = 0
        while (total_time < mean) :
            events = events + 1
            total_time = total_time + rand_exp (1.)
        return events
    
    
    # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
    
    def generate_poisson (mean, N, seed = 0.) :
        '''
        generazione di N numeri pseudo-casuali Poissoniani
        a partire da una pdf esponenziale
        '''
        if seed != 0. : random.seed (float (seed))
        randlist = []
        for i in range (N):
            # Return the next random floating point number in the range 0.0 <= X < 1.0
            randlist.append (rand_poisson (mean))
        return randlist