Code source de mlstatpy.garden.poulet
import math
import random
[docs]
def factorielle(x):
"""
Calcule :math:`x!` de façon récursive.
"""
if x == 0:
return 1
else:
return x * factorielle(x - 1)
[docs]
def profit(N, X, p, q, s):
"""
Calcule le profit.
:param N: nombre de poulets vendus
:param X: nombre de poulets achetés
:param p: prix d'achat
:param q: prix de vente
:param s: prix soldé
:return: profit
"""
if X <= N:
return X * (q - p)
else:
return X * (s - p) + N * (q - s)
[docs]
def proba_poisson(lx, i):
"""
Calcule la probabilité :math:`\\pr{X=i}``
lorsque :math:`X` suit une loi de Poisson de paramètre
:math:`\\lambda`.
"""
return math.exp(-lx) * (lx**i) / factorielle(i)
[docs]
def esperance(X, p, q, s, lx):
"""
Espérance du profit en faisant varier
le nombre de poulet vendus.
:param X: nombre de poulets achetés
:param p: prix d'achat
:param q: prix de vente
:param s: prix soldé
:param lx: paramètre :math:`\\lambda`
:return: espérance du profit
"""
res = 0.0
for i in range(lx * 2):
res += profit(float(i), X, p, q, s) * proba_poisson(lx, i)
return res
[docs]
def maximum(p, q, s, lx):
"""
Calcule les espérances de profit pour différents nombres
de poulets achetés.
:param p: prix d'achat
:param q: prix de vente
:param s: prix soldé
:param lx: paramètre :math:`\\lambda`
:return: liste ``(X, profit)``
"""
res = []
for X in range(2 * lx):
r = esperance(X, p, q, s, lx)
res.append((X, r))
return res
[docs]
def find_maximum(res):
"""
Trouver le couple (nombre de poulets achetés, profit)
lorsque le profit est maximum.
:param res: résultat de la fonction
:func:`maximum <mlstatpy.garden.poulet.maximum>`
:return: ``(X, profit)`` maximum
"""
m = (0, 0)
for r in res:
if r[1] > m[1]:
m = r
return m
[docs]
def exponentielle(lx):
"""
Simule une loi exponentielle de paramètre :math:`\\lambda`.
"""
u = random.random()
return -1.0 / lx * math.log(1.0 - u)
[docs]
def poisson(lx):
"""
Simule une loi de Poisson de paramètre :math:`\\lambda`.
"""
s = 0
i = 0
while s <= 1:
s += exponentielle(lx)
i += 1
return i - 1
[docs]
def poisson_melange(params, coef):
"""
Simule une variable selon un mélange de loi de Poisson.
:param params: liste de paramètre :math:`\\lambda`
:param coef: ``coef[i]`` coefficient associé
à la loi de paramètre ``params[i]``
:return: valeur simulée
"""
s = 0
for i, pa in enumerate(params):
p = poisson(pa)
s += p * coef[i]
return s
[docs]
def histogramme_poisson_melange(params, coef, n=100000):
"""
Calcule un histogramme d'un mélange de loi de Poisson.
:param params: liste de paramètre :math:`\\lambda`
:param coef: ``coef[i]`` coefficient associé
à la loi de paramètre ``params[i]``
:return: histogramme
"""
h = [0.0 for i in range(4 * max(params))]
for _i in range(n):
x = poisson_melange(params, coef)
if x < len(h):
h[x] += 1
s = sum(h)
for i in range(len(h)):
h[i] = float(h[i]) / s
return h
[docs]
def f_proba_poisson_melange():
"""
Wraps function *proba_poisson_melange* to avoid
global variable.
"""
proba_poisson_melange_tableau = []
def local_proba_poisson_melange(params, coef, i):
"""
Calcule la probabilité :math:`\\pr{X=i}``
lorsque :math:`X` suit un mélange de lois.
:param params: liste de paramètre :math:`\\lambda`
:param coef: ``coef[i]`` coefficient associé
à la loi de paramètre ``params[i]``
:return: valeur
"""
if not proba_poisson_melange_tableau:
proba_poisson_melange_tableau.extend(
histogramme_poisson_melange(params, coef)
)
if i >= len(proba_poisson_melange_tableau):
return 0.0
return proba_poisson_melange_tableau[i]
return local_proba_poisson_melange
proba_poisson_melange = f_proba_poisson_melange()