更新(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的速度大大加快了,這就是爲什麼我正在研究它。
這是一些整潔的研究! –
有趣的是,我在計算SVD時遇到了類似的問題,請看這裏:http://stackoverflow.com/questions/40052770/strange-behaviour-when-computing-svd-on-a-covariance-matrix-different- results-b –