IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Méthode du gradient Projeté


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 12
    Par défaut Méthode du gradient Projeté
    Bonjour, on nous demande d'écrire la méthode du gradient projeté en code Python. Cependant ,mon code ne compile et j'ai ce message qui appait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      line 32, in proj_grad
      x=b_c.ball_proj(x_old)
    AttributeError: 'tuple' object has no attribute 'ball_proj'

    voici le code:

    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 ball_constraint(center, radius):
        def ball(x):   #x est considere un vecteur et non une liste
            f=np.linalg.norm(x-c)-r**2
            return f
        def ball_grad(x):
            df=2*(x-c)
        def ball_proj(x):
            proj=c+r*(x-c)/np.linalg.norm(x-c)
        return ball, ball_grad,ball_proj
     
    # Projected gradient descend method
    def proj_grad(f, grad, x0, iterations, error_point, error_grad, constraint_proj, hstep):
     
         # Memory allocation
        dim = np.max(np.shape(x0)) # dimensions of the space
        x_list = np.zeros([dim, iterations]) # solution at each iteration
        f_list = np.zeros(iterations) # f. value at each solution point
        error_point_list = np.zeros(iterations) # error of solutions
        error_grad_list = np.zeros(iterations) # error of the gradient
     
         # Initialization
        x = x0
        x_old = np.copy(x)
        grad_x = grad(x)
        d_x = -grad_x
        f_x = f(x)
     
         # Iterative optimization
        for i in range(iterations):
            y=x_old-hstep*grad(x_old)
            b_c=ball_constraint(y,constraint_proj)
            x=b_c.ball_proj(x_old)
     
             # Log results
            x_list[:, i] = np.reshape(x, -1)
            f_list[i] = f_x
            error_point_list[i] = np.linalg.norm(x - x_old)
            error_grad_list[i] = np.linalg.norm(grad(x))
     
            if error_point_list[i]<error_point or error_grad_list[i]<error_grad : # termination condition
                break
            x_old = np.copy(x)
     
        return {'x_list': x_list[:, 0:i], 'f_list': f_list[0:i], 'error_point_list': error_point_list[0:i], 'error_grad_list': error_grad_list[0:i]}
    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    L'objet b_c n'a pas de méthode ball_proj puisque c'est tuple.

    Je pense que ce que tu veux faire avec x=b_c.ball_proj(x_old) correspond à x=b_c[2](x_old)...

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 12
    Par défaut
    Merci, mais là j'ai un nouveau message qui s'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      line 37
     error_point_list[i] = np.linalg.norm(x - x_old)
    TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'
    (dans la def ball_constraint , en première ligne; à la place des "center" et "radius" il doit y avoir c et r)

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 736
    Par défaut
    Salut,

    Citation Envoyé par Hsrn_b Voir le message
    Merci, mais là j'ai un nouveau message qui s'affiche
    Programmer, c'est comprendre les erreurs de son code pour les corriger.
    Et si une fonction retourne un tuple, vous devriez pourquoi x=b_c.ball_proj(x_old) pante et comment le corriger.

    Pour faire des suggestions de correction pertinente (qui marchent) il faut se plonger dans votre code pour comprendre ce que vous cherchez à faire.
    On peut le faire pour les débutants, çà ne prend pas trop de temps, mais c'est périlleux pour de vrais programmes (on va se tromper) et il n'y a que vous pour corriger çà.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par Hsrn_b Voir le message
    Merci, mais là j'ai un nouveau message qui s'affiche:
    Le problème c'est que je ne peux pas tester pour reproduire les problèmes, il nous faudrait un exemple qu'on puisse éxécuter...

    En plus il y a quelques points qui me semblent problématiques, cette fonction-là (ball_constraint) je ne la comprend pas trop :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def ball_constraint(center, radius):
        def ball(x):   #x est considere un vecteur et non une liste
            f=np.linalg.norm(x-c)-r**2
            return f
        def ball_grad(x):
            df=2*(x-c)
        def ball_proj(x):
            proj=c+r*(x-c)/np.linalg.norm(x-c)
        return ball, ball_grad,ball_proj

    1- Les paramètres center et radius ne servent à rien car ils ne sont pas utilisées...

    Cela signifie que lorsque tu fais : b_c=ball_constraint(y,constraint_proj) les paramètres y et constraint_proj sont ignorés...

    Si c'est censé être c et r alors il faut écrire : def ball_constraint(c, r):...

    2- Ensuite concernant les fonctions ball_grad et ball_proj eh bien je ne vois pas à quoi elles peuvent servir, elles ne retournent pas de résultat...

    Quand tu fais cela x=b_c.ball_proj(x_old) qui doit être en fait ceci x=b_c[2](x_old) eh bien x vaudra None car la fonction ne retourne pas de résultat via l'instruction return...

    Peut-être que tu as oublié d'ajouter return proj ?

    Citation Envoyé par Hsrn_b Voir le message
    Merci, mais là j'ai un nouveau message qui s'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      line 37
     error_point_list[i] = np.linalg.norm(x - x_old)
    TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'
    Comme on l'a vu au point 2 la variable x vaut None donc cela ne m'étonne pas qu'il y ait une erreur...




    EDIT : Ah oui je viens de comprendre que tu as corrigé le point 1... Bon il reste à voir le point 2...

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Pourquoi ball_grad et ball_proj ne retourne rien ? Le code à l'intérieur de c'est fonction est inutile si vous ne retourner aucun résultat.
    Et noter que si vous essayez de capturer le résultat d'une fonction qui ne retourne rien, et bien vous n'avez pas d'erreur, vous avez juste une variable qui se met à None (et ça vous fera surement une erreur plus loin)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def foo():
        #### Une fonction qui ne retourne rien
        x=7
     
    y = foo()  ### Il n'y a pas d'erreur
    print(y)    ### None car la fonction foo ne retourne rien
    Si maintenant suite à cette exemple vous écrivez

    Là vous aurez une erreur et Python vous dira qu'il ne peut pas multiplier None par 2.
    Et si à la fin de la fonction foo, vous ajoutez un return x, là ça va mieux se passer...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Méthode du Gradient Conjugué
    Par Carew dans le forum Mathématiques
    Réponses: 10
    Dernier message: 15/01/2013, 12h51
  2. Réponses: 17
    Dernier message: 06/02/2008, 19h44
  3. Programmation de la méthode du gradient conjugué
    Par Boule de coco dans le forum MATLAB
    Réponses: 11
    Dernier message: 18/01/2008, 22h12
  4. Méthode du gradient
    Par sof007 dans le forum Fortran
    Réponses: 2
    Dernier message: 07/06/2007, 11h18
  5. Extraire le nom des méthodes d'un projet
    Par nitrous007 dans le forum C#
    Réponses: 2
    Dernier message: 13/02/2007, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo