Bonjour,
Je viens pour la première fois sur ce forum demander de l'aide. Il m'a souvent été très utile auparavant car je code principalement en Python mais je suis assez nouveau dans le langage.
J'aimerais faire un ajustement complexe où je voudrais un grand nombre de paramètres à la fois, avec un grand nombre de données. Voici le code source:
Réponse de Python:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 def residu(tN,*param): t,N=tN S=2 M=len(t) A=airmass_obs(t) c1=param[0][3*S:3*S+N] c2=param[0][3*S+N:3*S+N*S] #print N,len(c1),len(c2) Tr=[transit(t,param[0][0],param[0][1],param[0][2]),transit(t,param[0][3],param[0][4],param[0][5])] result=np.zeros((S,N,M),'d') for s in xrange(S): for i in xrange(N): for j in xrange(M): if s==0: result[s,i,j]=A[j]*c1[i]-Tr[s][j] else: result[s,i,j]=A[j]*c2[i]-Tr[s][j] output=np.reshape(result,(1,S*N*M)) return output # pour un test avec des paramètres que que je connais. list_param=np.zeros(3*S+N*S) for g in xrange(3*S+N*S): if g==0: list_param[g]=1e-1 if g==1: list_param[g]=3000 if g==2: list_param[g]=20000 if g>=3 and g<6: list_param[g]=0. if g>=6 and g<6+N-1: list_param[g]=Y[0][g-6] if g>=6+N-1: list_param[g]=Y[1][g-N-6] print len(Y[0]),shape(list_param),list_param print shape(r1),shape(residu((t,N),list_param)) ## Le problème arrive ici popt,pcov=curve_fit(residu,(t,N),r1,sigma=error1) print popt
20.0 200.0
1284 (2574,) [ 1.00000000e-01 3.00000000e+03 2.00000000e+04 ..., -7.19211910e-02
-7.20481687e-02 -7.21678667e-02]
(1, 156648) 1
(1, 156648)
Traceback (most recent call last):
File "tamuz_appSDSS_V4_4D.py", line 175, in <module>
popt,pcov=curve_fit(residu,(t,N),r1,sigma=error1)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 530, in curve_fit
raise ValueError(msg)
ValueError: Unable to determine number of fit parameters.
Donc ici, je comprends bien qu'il ne sait pas combien de paramètres il doit ajuster. Mais lorsque j'ai essayé de lui donner p0 comme "first guess" avec le bon nombre de paramètres, il me donne ceci:
Traceback (most recent call last):
File "tamuz_appSDSS_V4_4D.py", line 175, in <module>
popt,pcov=curve_fit(residu,(t,N),r1,sigma=error1,p0=np.ones(S*N+3*S))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 555, in curve_fit
res = leastsq(func, p0, args=args, full_output=1, **kw)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 369, in leastsq
shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 20, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 449, in _weighted_general_function
return weights * (function(xdata, *params) - ydata)
File "tamuz_appSDSS_V4_4D.py", line 136, in residu
c1=param[0][3*S:3*S+N]
IndexError: invalid index to scalar variable.
A noter que j'ai été obligé d'utiliser la notation param[0][i] pour palier au problème précédent. Il est certain que je voulais une simple liste de paramètres mais Python l'a pensé comme un tableau ... je n'ai plus d'idées et j'espère trouver de l'aide ici.
Merci d'avance.
Partager