Ускорьте взвешенную по вероятности выборку в R

Как ускорить выборку с учетом вероятности в R.

# Let's assume we are considering following example:
w <- sample(1:4000,size=2e6, replace=T)   

# "w" will be integer, so we are going to convert it to numeric.
w <- as.numeric(w)

# Actually the sampling process have to be repeated many times.
M <- matrix(NA, 10, 2000)
system.time(
for (r in 1:10){
  ix <- sample(1:2e6,size=2000,prob=w/sum(w))
  M[r,] <- ix
})
# It's worth it to mention that without "prob=w/sum(w)" sampling is considerably faster.
# The main goal is to speed up sampling with probability weights!
system.time(ix <- sample(1:2e6,size=2000,prob=w/sum(w)))

Взвешенная выборка занимает 9,84 секунды, нормальная выборка — 0,01 секунды. Если у вас есть идеи, как можно ускорить взвешенную выборку, не стесняйтесь ответить.


person And_R    schedule 21.01.2014    source источник


Ответы (1)


Проблема скорости ограничивается только взвешенной выборкой без замены. Вот ваш код снова, перемещая части, не связанные с sample, за пределы цикла.

normalized_weights <- w/sum(w)
#No weights
system.time(
for (r in 1:10){
  ix <- sample(2e6, size = 2000)
})
#Weighted, no replacement
system.time(
for (r in 1:10){
  ix <- sample(2e6, size = 2000, prob = normalized_weights)
})
#Weighted with replacement
system.time(
for (r in 1:10){
  ix <- sample(2e6, size = 2000, replace = TRUE, prob = normalized_weights)
})

Большая проблема заключается в том, что когда вы выполняете взвешенную выборку без замены, каждый раз, когда вы выбираете значение, веса необходимо пересчитывать. См. ?sample:

Если «заменить» ложно, эти вероятности применяются последовательно, то есть вероятность выбора следующего элемента пропорциональна весам среди оставшихся элементов.

Могут быть более быстрые решения, чем использование sample (я не знаю, насколько хорошо оно оптимизировано), но это принципиально более ресурсоемкая задача, чем невзвешенная/взвешенная выборка с заменой.

person Richie Cotton    schedule 21.01.2014
comment
Веса не нужно нормализовать для sample. - person Roland; 21.01.2014
comment
@Roland Правда, sample сам выполнит нормализацию. (Действительно, он делает это много раз для взвешенной выборки без замены.) Я пытался позволить выборке выполнять наименьшую возможную работу для целей тестирования скорости. - person Richie Cotton; 21.01.2014