Feedback TP noté
- Mieux connaître les erreurs classiques en Python pour savoir comment les éviter.
Remarques générales
De manière logique, si une de vos fonctions en appelle une autre, il vaut mieux la placer avant dans un soucis de clarté qu’après son appel…
Une fois votre code fini, relancez le tout pour voir s’il fonctionne. Parfois vous avez des variables que vous avez renommées et qui ne sont plus définies, ou bien qui sont appelées mais définies plus tard dans le code. Cela peut être source d’erreurs…
ne pas coder en dure les tailles des problèmes dans les fonctions: si vous changez de problème, le code ne marchera plus. Ainsi, il vaut mieux éviter d’écrire:
def gradient_descente(grad_f, x_init, gamma, eps, n_iter): x = np.reshape(x_init, (23, 1))La dernière ligne peut être simplement:
x = np.reshape(x_init, (len(x_init), 1))si besoin. Idéalement, éviter aussi l’étapereshaped’ailleurs…Éviter la duplication de code, cela réduit le nombre de lignes et donc le nombre d’erreurs possibles. Par exemple:
for k in range(len(Iter_lin)): X1.append(Iter_lin[k][0]) Y1.append(Iter_lin[k][1]) for k in range(len(Iter_adapt)): X2.append(Iter_adapt[k][0]) Y2.append(Iter_adapt[k][1]) for k in range(len(Iter_méthode_1)): X3.append(Iter_méthode_1[k][0]) Y3.append(Iter_méthode_1[k][1])peut se réécrire:
my_list = [(Iter_lin, X1, Y1), (Iter_adapt, X2, Y2), (Iter_méthode_1, X3, Y3)] for (Iter, X , Y) in my_list: X.append([x[0] for x in Iter]) Y.append([x[1] for x in Iter])
pep8: amélioration de la lisibilité
écrire
x = x_initet non pasx=x_init. Cependant pour les attributs optionnels, il faut supprimer les espaces autour du=, par exemple on écrit:plt.subplots(2, 1, sharex=True).écrire
descentegrad(grad_f1, x, 0.01, 1000, 0.01)et non pasdescentegrad(grad_f1,x,0.01,1000,0.01)
numpy
la norme infinie s’obtient avec
np.linalg.norm(g, ord=np.inf)et nonnp.linalg.norm(g)(qui est la norme euclidienne par défaut).np.array([L[k] for k in range(len(L))])est équivalent ànp.array(L)vectorisation des codes: pensez à éviter les boucles pour certains calculs longs. Cela est plus rapide et plus lisible. Par exemple
for i in range(d): res = res + x[i]**2est équivalent à:
res = np.sum(x**2)si d est le nombre de composantes de x.
scipy
problème de chargement:
import scipy grad_fros = scipy.optimize.rosen_derne fonctionne pas. Il faut écrire:
from scipy.optimize import rosen_der grad_fros = rosen_dervoir par exemple https://stackoverflow.com/questions/18049687/attributeerror-module-object-scipy-has-no-attribute-why-does-this-error