2013-08-14 2 views
0

En tant qu'utilisateur R intermédiaire, je sais que pour les boucles peuvent très souvent être optimisées en utilisant des fonctions comme apply ou autrement. Cependant, je ne suis pas au courant des fonctions qui peuvent optimiser mon code actuel pour générer une matrice de chaînes markov, qui fonctionne assez lentement. Ai-je atteint la vitesse maximale ou y a-t-il des choses que je néglige? J'essaie de trouver la matrice de transition pour une chaîne de Markov en comptant le nombre d'occurrences dans les périodes de 24 heures avant les alertes données. Le vecteur ids contient tous les ID possibles (environ 1700).optimiser les calculs matriciels de la matrice de transition markov?

La matrice originale ressemble à ceci, à titre d'exemple:

>matrix 
     id  time 
     1  1376084071 
     1  1376084937 
     1  1376023439 
     2  1376084320 
     2  1372983476 
     3  1374789234 
     3  1370234809 

Et voici mon code pour essayer de gérer cela:

matrixtimesort <- matrix[order(-matrix$time),] 
frequency = 86400 #number of seconds in 1 day 

# Initialize matrix that will contain probabilities 
transprobs <- matrix(data=0, nrow=length(ids), ncol=length(ids)) 

# Loop through each type of event 
for (i in 1:length(ids)){ 
localmatrix <- matrix[matrix$id==ids[i],] 

# Loop through each row of the event 
for(j in 1:nrow(localmatrix)) { 
    localtime <- localmatrix[j,]$time 
    # Find top and bottom row number defining the 1-day window 
    indices <- which(matrixtimesort$time < localtime & matrixtimesort$time >= (localtime - frequency)) 
    # Find IDs that occur within the 1-day window 
    positiveids <- unique(matrixtimesort[c(min(indices):max(indices)),]$id) 
    # Add one to each cell in the matrix that corresponds to the occurrence of an event 

      for (l in 1:length(positiveids)){ 
      k <- which(ids==positiveids[l]) 
      transprobs[i,k] <- transprobs[i,k] + 1 
      } 
    } 

# Divide each row by total number of occurrences to determine probabilities 
transprobs[i,] <- transprobs[i,]/nrow(localmatrix) 
    } 
    # Normalize rows so that row sums are equal to 1 
    normalized <- transprobs/rowSums(transprobs) 

Quelqu'un peut-il faire des suggestions pour optimiser ce pour la vitesse ?

+0

Un bon point de départ est d'utiliser 'Rprof' pour profiler votre code. Cela vous dira où il passe le plus clair de son temps. – idfah

+0

Ceci est faux: "les boucles peuvent très souvent être optimisées en utilisant des fonctions comme apply". –

+0

Il existe un site CodeReview qui pourrait être plus approprié. –

Répondre

0

L'utilisation de boucles imbriquées semble être une mauvaise idée. Votre code peut être vectorisé pour accélérer.

Par exemple, pourquoi trouver le haut et le bas des numéros de ligne? Vous pouvez simplement comparer la valeur temporelle avec "time_0 + frequency": c'est une opération vectorisée.

HTH.

+0

La raison pour laquelle j'ai trouvé la rangée supérieure et inférieure est parce que c'est un énorme jeu de données (5 millions de lignes), et tester si chaque valeur "time" est dans time_0 et time_0 + frequency prend beaucoup plus de temps. il y a des semaines). C'est une bonne suggestion cependant. – user2588829

Questions connexes