import sympy as sy
x_sy, theta = sy.symbols('x_sy, theta', real=True, positive=True)
F = 1 - sy.exp(-x_sy/theta)
sy.init_printing()
F
sy.factor(F.subs(x_sy,x_sy+sy.Rational(1,2))-F.subs(x_sy,x_sy-sy.Rational(1,2)))
L=sy.prod([(sy.exp(sy.Rational(1,2)/theta)-sy.exp(-sy.Rational(1,2)/theta))*sy.exp(-x/theta) for x in sy.symbols('x:10',positive=True,real=True)]);L
sy.expand_log(sy.log(L),force=True)
l = sy.collect(sy.expand_log(sy.log(L),force=True),1/theta); l
sy.solve(sy.diff(l,theta),theta)
Nous chargeons les modules « indispensables » : numpy, scipy et matplotlib avec la commandes magique %pylab
%pylab
Nous assignons à une variable donnees
une liste
avec les données :
donnees = [70,11,66,5,20,4,35,40,29,8]
La valeur moyenne est obtenue avec la fonction mean
de scipy :
mean(donnees)
Nous définissons la fonction de vraisemblance (symbolique) :
L = sy.prod([sy.exp(-x/theta)/theta for x in sy.symbols('x:10',real=True,positive=True)]); L
Nous obtenons ensuite la log-vraisemblance :
l = sy.collect(sy.expand_log(sy.log(L),force=True),1/theta); l
x_dot = sy.symbols('x_dot',real=True,positive=True)
l = l.subs(sum([x for x in sy.symbols('x:10',real=True,positive=True)]), x_dot)
l
Nous définissons la fonction score :
S = sy.diff(l,theta)
S.subs(sum([x for x in sy.symbols('x:10',real=True,positive=True)]), x_dot)
Nous définissons la fonction d'information :
I = - sy.diff(S,theta)
I.subs(sum([x for x in sy.symbols('x:10',real=True,positive=True)]), x_dot)
Nous obtenons l'EMV comme l'argument qui annulle la fonction score :
theta_chapeau = sy.solve(S,theta)[0]
theta_chapeau
Nous vérifions que l'information est positive en theta_chapeau
:
I.subs(theta,theta_chapeau)
Nous définissons une version numérique de la fonction de vraisemblance :
def l_fct(x, x_dot = sum(donnees), n=len(donnees)):
return -n*log(x) - float(x_dot)/x
l_fct(sum(donnees)/float(len(donnees)))
Nous définissons la fonction de log-vraisemblance relative :
def r(x, l_max = l_fct(sum(donnees)/float(len(donnees)))):
return l_fct(x) - l_max
Nous la traçons après avoir utiliser une autre commande magique qui nous intégre les figure dans notre carnet de notes :
%matplotlib inline
xx = arange(10,100)
plot(xx,r(xx))
grid()
ylim([-5,0])
axhline(y=log(0.5),color='red')
axhline(y=log(0.1),color='red')
axhline(y=log(0.01),color='red')