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

R Discussion :

Optimisation sous contrainte


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Par défaut Optimisation sous contrainte
    Bonjour,

    Je suis nouveau sur le forum.
    J'ai un problème d'optimisation sous R depuis un moment. Le souci, c'est que j'ai une maximisation à faire, j'utilise maxLik, j'écris la vraisemblance et tout. Sauf qu'il y a plusieurs contraintes sur les paramètres, à cause de fonctions log ou sqrt dans le code, certains paramètres ne peuvent pas être négatifs par exemple. Donc, l'optimisation se lance sauf que le maximum n'est jamais atteint puisque ça correspond aux valeurs limites de calcul: par ex, le paramètre qui ne peut pas être négatif retournera -0.0000001.

    De manière générale, comment faites-vous pour contraindre les paramètres et dire à l'algo de ne pas chercher plus loin?

    Merci de votre aide. Moi, j'ai tout essayé...

  2. #2
    Membre émérite

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Billets dans le blog
    2
    Par défaut
    Bonjour yao,

    Je me demande si tu as bien programmé ta fonction mais pour cela j'aurais besoin d'en savoir plus sur ton log de vraisemblance et sur les raisons qui font que tu as besoin de contraintes.

    Cordialement.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Par défaut
    Bonjour dev_ggy,

    Merci de ta réponse.
    En fait il s'agit d'un max de vraisemblance simulé.

    Voici un extrait du 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    =======================================================
    L4<-function(par){
     
        beta<-par[1]
        theta<-par[2]
        alpha1<-par[3]
        alpha2<-par[4]
        alpha3<-par[5]
        alpha4<-par[6]
        pi<-par[7]
        sigma01<-par[8]
     
    #beta doit etre entre -1 et 0 à cause des log(beta) plus tard
    #sigma doit être entre beta et -beta car sigma^2 < beta^2 a cause de denom
     
    	 denom<-(beta^2-sigma01^2)
    # Denom doit être différent de 0 car au dénominateur plus tard
     
    	u0<-tau
     
    	alphas<-alpha1*educ+alpha2*age+alpha3*sex+alpha4*concern
     
    	om<- list()
    	for (i in 1:R)
    	{
    	om[[i]]<-c(exp(alphas-u0[i])
            +exp(theta)*(travcost-pt1)
    	+exp(pi)*pt1)
     
    #	om doit être toujours positif
    	}
     
    	omega<- list()
    	for (i in 1:R)
    	{
    	omega[[i]]<-c(log(om[[i]])
    	+(1+beta)*(log(1+beta)-theta-log(travcost))
    	+beta*alphas-beta*log(-beta))
    	}
     
    	OMEGA<-do.call(cbind,omega)
     
            sp<-matrix(0, nrow=507, ncol=R)
     
            for (i in 1:507)
           {
    	sp[i,]<-pnorm((OMEGA[i,]-sigma01*u0)/sqrt(denom))
            }
           SP<-rowMeans(sp)
     
    #SP est une proba donc entre 0 et 1 
     
            mSP<-1-SP
     
    	S<-sum(y1*log(SP)+(1-y1)*log(mSP))
     
    	return(S)
    	}
    ======================================================
    On peut donc voir que beta doit être entre -1 et 0
    sigma doit être entre beta et -beta et justement c'est ce que je veux essayer de dire à R: rester dans ces valeurs là quand l'optimisation se lance.

  4. #4
    Membre chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Par défaut
    Citation Envoyé par yao007 Voir le message
    Bonjour dev_ggy,

    Voici un extrait du code:
    L4<-function(par){

    beta<-par[1]
    theta<-par[2]
    alpha1<-par[3]
    alpha2<-par[4]
    alpha3<-par[5]
    alpha4<-par[6]
    pi<-par[7]
    sigma01<-par[8]

    ....

    On peut donc voir que beta doit être entre -1 et 0
    sigma doit être entre beta et -beta et justement c'est ce que je veux essayer de dire à R: rester dans ces valeurs là quand l'optimisation se lance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    optim(TAGRAINE, L4,  method = "L-BFGS-B",     
          lower=c(-1,...les min des autres paramètres....),
    upper=c(0,...les max des autres paramètres...))
    #Cette méthode permet de donner un intervalle dans lequel chercher chacun de tes paramètres : ici ton beta sera cherché dans [-1;0]


    Pour ton sigma qui ne doit pas annuler le dénominateur, je m'y prendrais autrement. Au lieu de mettre sigma en paramètre, tu mets direct le dénominateur et tu mets ton lower à 0 sur le dénominateur dans optim.
    Tu retrouves sigma à partir de beta et du dénominateur.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Par défaut
    Merci Sengar. J'avais essayé le L-BFGS-B mais j'y avais pas pensé, ça devrait régler le problème du beta et du sigma.

    Cependant, le souci du L-BFGS-B est que dès qu'il rencontre un NaN, il s'arrête. Hors j'ai un problème avec mes om dans le code. Un moment je fais log(om) et bien sûr il faut que ceux-ci soient positifs. Donc ça bloque le L-BFGS-B, malheureusement. Je pense que si je règle ça, ça devrait aller.

  6. #6
    Membre chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Par défaut
    Citation Envoyé par yao007 Voir le message
    Merci Sengar. J'avais essayé le L-BFGS-B mais j'y avais pas pensé, ça devrait régler le problème du beta et du sigma.

    Cependant, le souci du L-BFGS-B est que dès qu'il rencontre un NaN, il s'arrête. Hors j'ai un problème avec mes om dans le code. Un moment je fais log(om) et bien sûr il faut que ceux-ci soient positifs. Donc ça bloque le L-BFGS-B, malheureusement. Je pense que si je règle ça, ça devrait aller.
    En fait dès qu'il y a des contraintes sur une fonction des paramètres, il faut mettre en paramètre directement le résultat de cette fonction. (et enlever un paramètre qui devient superflu).

    om[[i]]<-c(exp(alphas-u0[i])
    +exp(theta)*(travcost-pt1)
    +exp(pi)*pt1)
    Si om doit être positif alors tu changes tes paramètres:

    beta<-par[1]
    theta<-par[2]
    om<-par[2] avec la contrainte dans BFGS que om >0 (ou en tout cas > à un petit nombre car je crois que les inégalités sont supérieures ou égale dans optim)
    alpha1<-par[3]
    alpha2<-par[4]
    alpha3<-par[5]
    alpha4<-par[6]
    pi<-par[7]
    sigma01<-par[8]
    Et dans ton code tu retrouves theta comme fonction de om et pi


    edit : je viens de voir que om est une liste c'est plus galère que je pensais...
    pas le temps d'y reflechir plus ce soir sorry, j'espere que ma réponse t'inspirera au moins à défaut de te donner la bonne réponse direct ^^

Discussions similaires

  1. Probleme d'optimisation sous contraintes
    Par Claire_Juzeau dans le forum MATLAB
    Réponses: 16
    Dernier message: 21/01/2020, 09h15
  2. Optimisation sous contraintes pour calibration de caméra
    Par velkouby dans le forum Mathématiques
    Réponses: 6
    Dernier message: 23/10/2008, 09h46
  3. Optimisation sous contraintes
    Par Neuromancien2 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 10/11/2006, 14h37
  4. [JSP] rafraichir une page sous contrainte
    Par enguerran dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/06/2006, 03h30
  5. Problème : modifier une matrice sous contraintes
    Par andjeo dans le forum Algorithmes et structures de données
    Réponses: 44
    Dernier message: 27/03/2006, 17h04

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