Как промежуточный пользователь R, я знаю, что для циклов очень часто можно оптимизировать, используя такие функции, как apply
или иначе. Тем не менее, я не знаю о функциях, которые могут оптимизировать мой текущий код для генерации матрицы цепочек марков, которая работает довольно медленно. Могу ли я максимизировать скорость или есть вещи, которые я пропускаю? Я пытаюсь найти матрицу перехода для цепи Маркова, посчитав количество вхождений в 24-часовых периодах времени перед получением предупреждений. Вектор ids
содержит все возможные идентификаторы (около 1700).оптимизация марковских вычислений матрицы перехода цепи?
Оригинальная матрица выглядит следующим образом, в качестве примера:
>matrix
id time
1 1376084071
1 1376084937
1 1376023439
2 1376084320
2 1372983476
3 1374789234
3 1370234809
А вот мой код, чтобы попытаться справиться с этим:
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)
Можно ли делать какие-либо предложения по оптимизации этой скорости ?
Хорошим местом для начала является использование 'Rprof' для профилирования вашего кода. Это расскажет вам, где он проводит большую часть времени. – idfah
Это неверно: «петли очень часто могут быть оптимизированы с помощью таких функций, как apply». –
Существует сайт CodeReview, который может быть более уместным. –