2013-02-10 110 views
1

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

我的目标是从两个二元正态分布生成10 + 10平均值,然后使用前10个方法生成标记为“绿色”的点,其他十个方法生成“红色”点。必须从中生成一个点的双变量高斯的平均值必须每次随机挑选。我对R不太熟悉,所以我使用了for循环,因为它越来越大,所以需要花费很多时间。这里是我的代码:

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

您可以完全跳过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) 
+0

这两个命令是不等价的, '样品( redMeans,1,replace = TRUE)' 没有考虑到我们手中有一个二维数组的事实;它会从矢量中的20个标量中选取一个随机数。它应该从矢量redMeans中选取一个随机点。 另外,'mvrnorm'的'mu'参数不能像那样工作。 'mu'是给出变量平均值的向量,而不是包含每个单一点平均值的向量。 – jsonaj 2013-02-10 11:47:09

+0

@ user2058602我删除了我的答案的错误和推测部分。 – 2013-02-10 11:49:16