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 ?
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
Ceci est faux: "les boucles peuvent très souvent être optimisées en utilisant des fonctions comme apply". –
Il existe un site CodeReview qui pourrait être plus approprié. –