2013-02-10 173 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