Forum de Statistiques
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Les posteurs les plus actifs de la semaine
Jean-Pierre Jacus
Comment utiliser la fonction predict Vote_lcapComment utiliser la fonction predict Voting_barComment utiliser la fonction predict Vote_rcap 


Comment utiliser la fonction predict

2 participants

Aller en bas

Comment utiliser la fonction predict Empty Comment utiliser la fonction predict

Message par sara Mer 10 Juil 2013 - 7:13

Bonjour,

je viens de commencer la programmation en R et j'ai du mal a utiliser la fonction predict. En fait je suis en train de faire une prediction des scenarios d'optimisation pour des programmes donnes. Je dispose donc d'un dataframe avec les programmes, les fonctions(qui est une partie du programme), des features(projection des fonctions dans un espace multidimensionnel), les scenario ids, et les speedups(qui est un reel) Pour chaque programme, je cherche le voisin le plus proche (en calculant la distance euclidienne ) et je prends le scenario id du voisin le plus proche. Cependant je cherche a optimiser le programme en ayant a chaque fois le speedup le plus eleve et donc au lieu de calculer la distance euclidienne, je cherche des coefficients d'un vecteur lambda tels que: distance(x,y) = sqrt(sum(lambda[i]* (x[i] - y[i])^2 )) et je recherche le voisin le plus proche et je prends son scenario id. Jusque la tout va bien, mais j'aimerais utiliser la fonction predict pour predire le scenario id d'un programme quelconque et c'est la que j'implemente la fonction model et je fais predict(model, data = testX) et c'est la qu'il m'affiche  
Erreur dans UseMethod("predict") :
 pas de méthode pour 'predict' applicable pour un objet de classe "function"

Voici le code (oui c'est long mais tout est explique ci dessus ) : merci de m'aider

model <- function(ids, x, y, inputData) {
     # code pour trouver les coefficients
   
     # initial values of lambda (to obtain euclidean distance)
     lambda <- c()
     lambda[1:length(x)] <- 1

     distance <-function(a,b,lambda){
         distSq <- 0.0
         for(i in 1 : length(a)){
            distSq <- distSq + (as.numeric(lambda[i])*((as.numeric(a[i])-as.numeric(b[i]))^2))
         }
         return (as.numeric(distSq^(1/2)))
     }

     testIds     <- ids[1:floor(length(ids)  /fold)  ]
     testX       <- x  [1:floor(nrow(x)      /fold) ,]

     trainingIds <- ids[-(1:floor(length(ids)/fold)) ]  
     trainingX   <- x  [-(1:floor(nrow(x)    /fold)),]
     trainingY   <- y  [-(1:floor(length(y)  /fold)) ]


     nnPredict <- function(testX) {
     # prediction code
         predictor <- c()
 for (i in 1 : nrow(testX)) {
              distanceVector <- apply(trainingX,1,function(a){distance(testX[i,],a,lambda)})
      predictor <- c(predictor, trainingY[which.min(distanceVector)])
 }
   return(predictor)
     }

# finds the vector of scenario speedups and returns the average speedup
     averageSpeedup <- function(testIds, testX, inputData) {
 testY <- nnPredict(testX)  
         truc <- data.frame("ids" = testIds, "y" = testY)
 for (i in 1 : nrow(truc)) {
      if(length(which(inputData$ids == truc$ids[i] & inputData$"scenario id" == truc$y[i])) != 0L)
                   truc$speedup[i] <- inputData[which(inputData$ids == truc$ids[i] & inputData$"scenario id" == truc$y[i]), "speedup"]
         }    
 return (mean(truc$speedup))
     }      
     
   
    # initial speedup average (using euclidean distance)
    maxAverage <- averageSpeedup(testIds,testX, inputData)

    for (i in 1 : 1000) {  
        lambda <- runif(length(x),0,2)
        if (averageSpeedup(testIds, testX, inputData) > maxAverage) {
             nnPredictor <- nnPredict(testX)
     maxAverage <- averageSpeedup(testIds, testX, inputData)
         }
     }
return(nnPredict)
}


Dernière édition par sara4391 le Mer 10 Juil 2013 - 8:11, édité 1 fois

sara

Nombre de messages : 4
Date d'inscription : 10/07/2013

Revenir en haut Aller en bas

Comment utiliser la fonction predict Empty Re: Comment utiliser la fonction predict

Message par sara Mer 10 Juil 2013 - 8:08

J'ai lu qu'en principe predict prend un objet qui herite de lm, mais dans mon cas il n'y a pas de regression lineaire, il s'agit d'un algo que j'implemente "a la main", quelqu'un pourrait m'aider svp ?

sara

Nombre de messages : 4
Date d'inscription : 10/07/2013

Revenir en haut Aller en bas

Comment utiliser la fonction predict Empty Re: Comment utiliser la fonction predict

Message par droopy Mer 10 Juil 2013 - 9:12

predict est une fonction générique qui fonctionne avec différents types d'objets comme lm mais pas seulement :
methods(predict)
Une possibilité : créer un objet avec une class particulière ("algo" par exemple) et lui associée une fonction de prédiction : predict.algo.
Cdlt
droopy
droopy

Nombre de messages : 1156
Date d'inscription : 04/09/2009

Revenir en haut Aller en bas

Comment utiliser la fonction predict Empty Re: Comment utiliser la fonction predict

Message par sara Jeu 11 Juil 2013 - 0:50

c'est a dire que je cree une classe "algo" et a l'interieur je cree une methode de classe predict.algo ? je n'ai pas compris l'idee

sara

Nombre de messages : 4
Date d'inscription : 10/07/2013

Revenir en haut Aller en bas

Comment utiliser la fonction predict Empty Re: Comment utiliser la fonction predict

Message par droopy Jeu 11 Juil 2013 - 7:40

concretement il te faut créer ta propre fonction pour les prédictions
droopy
droopy

Nombre de messages : 1156
Date d'inscription : 04/09/2009

Revenir en haut Aller en bas

Comment utiliser la fonction predict Empty Re: Comment utiliser la fonction predict

Message par sara Ven 12 Juil 2013 - 0:23

Oui, c'est bon ca a marche, merci

sara

Nombre de messages : 4
Date d'inscription : 10/07/2013

Revenir en haut Aller en bas

Comment utiliser la fonction predict Empty Re: Comment utiliser la fonction predict

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum