2013-12-18 17 views
6

更新(2014年8月):我從來沒有這個底部,從來沒有對革命的論壇的任何反饋。然而,這個問題似乎已經在Revolution R 7.2中得到修復(R 3.0.3,再次是學術版本)。我跑以下幾百倍的LME()檢驗,全部產生平等的結果,符合市場預期。[更新]LME()不同的結果下轉速R每次運行(MKL惹的禍?)

我剛裝轉速R 7.0(R 3.0.2)的學術版上新的PC,並獲得下面的代碼奇怪的結果。每次運行代碼時,都會給出不同的結果。在CRAN-R下,結果總是相同的(我認爲它應該是這樣)。該代碼片段來自於版本爲1.8.10的test.data.table()的測試527,它指出了錯誤。

library(nlme) 
all.equal(lme(distance ~ age, data=Orthodont), lme(distance ~ age, data=Orthodont)) 

我得到像下面這樣的東西,但每次都不一樣。

> all.equal(lme(distance ~ age, data=Orthodont), lme(distance ~ age, data=Orthodont)) 
[1] "Component 4: Component 2: Component 1: Mean relative difference: 1.774149e-08" 
[2] "Component 7: Mean relative difference: 0.0003335902" 

的「樂趣」的事情是,nlme包(其中lme()是一部分)本身是相同的,我卸載並重新安裝,以確保(包的nlme_3.1-113.zip文件是位相同)。

我還不知道還有什麼值得一試的。任何指針或想法,將不勝感激。我也發佈在革命的論壇上,但它似乎比這裏少得多...

這是在64位Windows 8.1,64位R以及英特爾i7-4770 CPU,如果它很重要。 Revolution R(R 3.0.2)和前一版本(2.15.3)的當前版本都會產生意想不到的(對我來說)行爲。 CRAN-R 3.0.1和3.0.2產生相同的結果。

sessionInfo()輸出革命R:

> sessionInfo() 
R version 3.0.2 (2013-09-25) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] nlme_3.1-113  Revobase_7.0.0 RevoMods_7.0.0 RevoScaleR_7.0.0 
[5] lattice_0.20-24 rpart_4.1-3  

loaded via a namespace (and not attached): 
[1] codetools_0.2-8 foreach_1.4.1  grid_3.0.2  iterators_1.0.6 
[5] pkgXMLBuilder_1.0 revoIpe_1.0  tools_3.0.2  XML_3.98-1.1 

更新1: 我已經查明的問題(下面的一些指針從下面&評論答案)的事實,革命R使用英特爾MKL BLAS庫。如果我切換到由CRAN提供的BLAS庫,問題就會消失。 (注意:我不知道自己編譯R,所以我沒有測試過OpenBLAS和其他的選擇,在Revolution R中它只是重命名兩個dll-s的問題)。

似乎其他人得到inconsistent results with MKL as well。機器容差範圍內的差異,即all.equal()爲TRUE,而identical()爲FALSE。在我看來,不同的結果似乎意義重大。

我已經在Revolution R的論壇上發佈了這個問題,如果我得到回覆,會在這裏更新。我想在這一點上我的問題應該修改爲「何時使用MKL BLAS以及何時使用CRAN-R BLAS」。這不是速度問題(*),而是一致和正確的結果。我會花更多的時間尋找一個標準測試套件(不確定這裏的術語?)來檢查R的輸出與已知的正確輸出。這是我喜歡的關於data.table的事情之一,它對最終用戶有自己的測試可見。我知道,我不應該期望一個包含所有(甚至是大部分)軟件包的測試,但至少涵蓋了基本功能。

(*)速度取決於具體的工作流程。在這種特殊情況下,CRAN BLAS比MKL更快(都運行單線程)。在其他的工作中,革命R的速度大大加快了,這就是爲什麼我正在研究它。

+0

這是一些整潔的研究! –

+0

有趣的是,我在計算SVD時遇到了類似的問題,請看這裏:http://stackoverflow.com/questions/40052770/strange-behaviour-when-computing-svd-on-a-covariance-matrix-different- results-b –

回答

4

有人猜測,Revo R將CPU核並行化,重組平行事物的算術並不總是聯繫在一起。換句話說,這取決於操作的順序。如果線程以不同的順序完成,如果內核必須執行其他操作,則結果會以不同的順序相加,並且(a + b)+ c在浮動時不總是等於a +(b + c)點...

要檢查,有沒有什麼方法可以告訴Revo R只使用一個CPU內核?

+1

+1:在窗口中轉到任務管理器,進程,右鍵單擊您的revoR進程,設置關聯並取消選擇除一個核心之外的所有內容 –

+1

這是一個好主意,但似乎不是原因。我檢查了將親和力設置爲單個核心,相同的行爲。差異比浮點錯誤所預期的要大得多。 AFAIK'all.equal()'負責機器舍入,而不是'identical()'。無論如何,'專業等級R'應該注意這種不一致性,對嗎? – Peter

+0

這種行爲和RNG(以及錯誤)是我見過這種方式失敗的唯一原因。你在多次運行之前用set.seed(99)試過了嗎?否則,你的選擇是a)追蹤lme4中答案分歧的地方,b)詢問Revo人。 – Spacedman

相關問題