优化循环

时间:2013-02-10 11:02:35

标签: r machine-learning

我正在实施“统计学习要素:数据挖掘,推理和预测”(Hashtle,Tibshirani,Friedman)一书中给出的一个例子。

我的目标是从两个双变量正态分布中生成10 + 10个平均值,然后使用前十个平均值生成标记为“绿色”的点,另外十个平均值生成“红色”点。必须每次随机挑选必须生成一个点的双变量高斯的平均值。我对R不太熟悉,所以我使用了for循环,随着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]
    }

1 个答案:

答案 0 :(得分:0)

您可以完全跳过for循环并使用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)