Bonjour,
Je suis débutante sous python (et en programmation) et j'ai des problèmes pour maximiser une fonction de vraisemblance:
- J'arrive à calculer ma fonction quand je lui donne une valeur de paramètre.
- Si je fais varier la valeur de mon paramètre je trouve un maximum pour ma fonction que je peux visualiser sur une courbe.
Cependant quand j'essaie d'utiliser les fonctions d'optimisation de scipy (ex: la fonction fmin_cobyla), une erreur m'est renvoyée:
Je crois comprendre que cette erreur est liée à l'appel de la fonction hypergéométrique (hyp2f1, du module scipy) dans le calcul de ma fonction de vraisemblance mais je ne sais pas quoi faire (surtout que ma fonction marche très bien en dehors d'une fonction d'optimisation).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 >>> gg=array([0.5]) # valeur initiale du paramètre >>> def constr1(x): # veut m >= 0 return x >>> def constr2(x): # et m =< 1 return 1-x >>> fmin_cobyla(pnn, gg, [constr1, constr2], rhoend=1e-7) capi_return is NULL Call-back cb_calcfc_in__cobyla__user__routines failed. Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.6/dist-packages/scipy/optimize/cobyla.py", line 96, in fmin_cobyla iprint=iprint, maxfun=maxfun) File "/usr/lib/python2.6/dist-packages/scipy/optimize/cobyla.py", line 88, in calcfc f = func(x, *args) File "<stdin>", line 13, in pnn File "/usr/lib/pymodules/python2.6/mpmath/functions/hypergeometric.py", line 249, in hyp2f1 return ctx.hyper([a,b],[c],z,**kwargs) File "/usr/lib/pymodules/python2.6/mpmath/functions/hypergeometric.py", line 198, in hyper z = ctx.convert(z) File "/usr/lib/pymodules/python2.6/mpmath/ctx_mp_python.py", line 654, in convert return ctx._convert_fallback(x, strings) File "/usr/lib/pymodules/python2.6/mpmath/ctx_mp.py", line 544, in _convert_fallback raise TypeError("cannot create mpf from " + repr(x)) TypeError: cannot create mpf from array([ 1.])
Voici la partie de ma fonction de vraisemblance dans laquelle je fais appel à la fonction hypergéométrique et à la fonction beta (aussi une fonction du module scipy et qui me renvoie le même type d'erreur):
Je veux m compris entre 0 et 1 (bornes définies dans les fonctions "constr") et j'ai pris par exemple : w=1, xesp=0.02, J=400
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 def pnn(m): eta= w*((1-m+xesp*(w-1))/(1-m*w+xesp*(w-1))) lambd=((J-1)*m*xesp)/(1-m+xesp*(w-1)) xi=1+(((J-1)*(1-xesp*w*m+xesp*(w-1)))/(1-w*m+xesp*(w-1))) Z=1/(hyp2f1(-J,lambd,1-xi,eta)) # fonction hypergéométrique betacalc=beta(lambd+nesp,xi-nesp)/beta(lambd,xi) # fonction beta ... finall=Z*betacalc*(eta**nesp)*pochham*pochham2 return -finall
Par ailleurs sans les lignes betacalc et Z dans la fonction pnn, l'optimisation fonctionne avec fmin et fmin_cobyla.
Est-ce que quelqu'un peut m'aider?
(je travaille sous Linux et sous la version 2.6.6 de Python)
Merci d'avance!
Partager