2013-02-10 2 views
1

Я реализую пример, приведенный в книге «Элементы статистического обучения: интеллектуальный анализ данных, вывод и предсказание» (Хэшлт, Тибширани, Фридман).Оптимизация цикла

Моя цель состоит в том, чтобы генерировать 10 + 10 средств из двух двумерных нормальных распределений, а затем использовать первые десять средств для создания точек с надписью «Зеленый», а остальные десять - для создания «красных» точек. Среднее значение двумерного гауссова, из которого должна генерироваться точка, должно выбираться случайным образом каждый раз. Я не слишком хорошо знаком с R, поэтому я использовал for-loop, используя который занимает очень много времени, когда n становится больше. Вот мой код:

Sigma = diag(2) 
greenMeans= mvrnorm(n=10, c(1,0), Sigma) 
redMeans= mvrnorm(n=10, c(0,1), Sigma) 

n=1000000 
green<- array(dim=c(n,2)) 
red<- array(dim=c(n,2)) 

for (i in 1:n) 
     { 
      newGreen<- mvrnorm(n=1,greenMeans[sample(c(1:10),1,replace=TRUE),], Sigma/5) 
      newRed<- mvrnorm(n=1,redMeans[sample(c(1:10),1,replace=TRUE),], Sigma/5) 
      green[i,1] <- newGreen[1] 
      green[i,2] <- newGreen[2] 
      red[i,1] <- newRed[1] 
      red[i,2] <- newRed[2] 
    } 

ответ

0

Вы можете пропустить цикл полностью и использовать replicate, не уверен, насколько быстрее это, хотя:

do_stuff = function() { 
    newGreen<- mvrnorm(n=1,greenMeans[sample(c(1:10),1,replace=TRUE),], Sigma/5) 
    newRed<- mvrnorm(n=1,redMeans[sample(c(1:10),1,replace=TRUE),], Sigma/5)   
    return(list(newGreen, newRed)) 
} 
replicate(10000, do_stuff) 
+0

эти две команды не эквивалентны, 'образца (redMeans, 1, replace = TRUE) ' не принимает во внимание тот факт, что у нас есть двумерный массив в наших руках; он выбирает случайное число из 20 скаляров в векторе. Он должен выбрать случайную точку из векторных redMeans. Кроме того, аргумент 'mu'' mvrnorm' не работает так. 'mu' - вектор, предоставляющий средства переменных, а не вектор, содержащий средства для каждой отдельной точки. – jsonaj

+0

@ user2058602 Я удалил неправильную и спекулятивную часть моего ответа. –

Смежные вопросы