2013-08-14 3 views
0

Как промежуточный пользователь 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) 

Можно ли делать какие-либо предложения по оптимизации этой скорости ?

+0

Хорошим местом для начала является использование 'Rprof' для профилирования вашего кода. Это расскажет вам, где он проводит большую часть времени. – idfah

+0

Это неверно: «петли очень часто могут быть оптимизированы с помощью таких функций, как apply». –

+0

Существует сайт CodeReview, который может быть более уместным. –

ответ

0

Использование вложенных циклов кажется плохой идеей. Ваш код может быть векторизован для ускорения.

Например, зачем искать верх и низ номеров строк? Вы можете просто сравнить значение времени с «time_0 + frequency»: это векторная операция.

HTH.

+0

Причина, по которой я нашел верхнюю и нижнюю строку чисел, состоит в том, что это огромный набор данных (5 миллионов строк) и проверка того, находится ли каждое «временное» значение в пределах времени_0, а частота time_0 + занимает гораздо больше времени (я пробовал синхронизировать это несколько недели назад). Это хорошее предложение. – user2588829