R ns的变化没有明显的原因

R ns的变化没有明显的原因,r,R,我使用带有最小二乘拟合的spline::ns的结果变化很大,我看不出任何押韵或原因,我想我已经将问题追溯到了ns函数本身 我将问题归结为: require(splines) N <- 0 set.seed(1) for (i in 1:100) N <- N + identical(ns(1:10,3),ns(1:10,3)) N 结果为[1]5.551115e-17 5.551115e-17。这种可变性给我带来了很大的问题,因为我的optimize(…)$min现在有时甚至在第一

我使用带有最小二乘拟合的
spline::ns
的结果变化很大,我看不出任何押韵或原因,我想我已经将问题追溯到了
ns
函数本身

我将问题归结为:

require(splines)
N <- 0
set.seed(1)
for (i in 1:100) N <- N + identical(ns(1:10,3),ns(1:10,3))
N
结果为
[1]5.551115e-17 5.551115e-17
。这种可变性给我带来了很大的问题,因为我的
optimize(…)$min
现在有时甚至在第一个数字上也会发生变化,导致结果不可重复

我的sessionInfo和一个干净的普通会话:

我使用

> .Last <- function() system("R --vanilla") 
> q("no")
.最后一个问题(“否”)
这会将会话吹走,当我重新启动它时,我会得到干净的香草会话。然后,在回答本·博尔克的澄清问题时,我在清洁香草课程开始时这样做了:

> sessionInfo()
R version 2.14.2 (2012-02-29)
Platform: x86_64-pc-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] Revobase_6.1.0   RevoMods_6.1.0   RevoScaleR_3.1-0 lattice_0.20-0  
[5] rpart_3.1-51    

loaded via a namespace (and not attached):
[1] codetools_0.2-8   foreach_1.4.0     grid_2.14.2       iterators_1.0.6  
[5] pkgXMLBuilder_1.0 revoIpe_1.0       tools_2.14.2      XML_3.9-1.1      
> require(splines)
Loading required package: splines
> N <- 0
> set.seed(1)
> for (i in 1:100) N <- N + identical(ns(1:10,3),ns(1:10,3))
> N
[1] 32
>sessionInfo()
R版本2.14.2(2012-02-29)
平台:x86_64-pc-mingw32/x64(64位)
区域设置:
[1] LC_COLLATE=英语_美国1252
[2] LC_CTYPE=英语_美国1252
[3] LC_MONETARY=英国和美国1252
[4] LC_NUMERIC=C
[5] LC_时间=英语_美国1252
附加基本包:
[1] 统计图形GRUTILS数据集方法库
其他随附包裹:
[1] Revobase_6.1.0 RevoMods_6.1.0 RevoScaleR_3.1-0 lattice_0.20-0
[5] rpart_3.1-51
通过命名空间加载(未附加):
[1] codetools_0.2-8 foreach_1.4.0 grid_2.14.2迭代器_1.0.6
[5] pkgXMLBuilder_1.0 revoIpe_1.0 tools_2.14.2 XML_3.9-1.1
>需要(样条曲线)
加载所需包:样条
>N组种子(1)
>对于(1:100中的i)N
[1] 32

这是我从REvolution技术支持部门得到的答案(经允许发布在此处):

这里的问题是浮点运算的问题。革命 R使用英特尔mkl BLAS库进行某些计算,这与 根据CRAN-R对“ns()”使用和使用此库的内容 计算。在这种情况下,您也会得到不同的结果 这取决于您是否在一台计算机上进行计算 基于英特尔处理器的机器或带有AMD芯片组的机器

我们提供的BLAS和Lapack DLL与随附的相同 CRAN-R,但它们不是与Revolution R一起使用的默认值。 如果客户愿意,可以恢复已安装的DLL, 通过执行以下操作:

1) 。将“Rblas.dll”重命名为“Rblas.dll.bak”,将“Rlapack.dll”重命名为 'Rlapack.dll.bak' 在文件夹“C:\Revolution\R-Enterprise-6.1\R-2.14.2\bin\x64”中

2) 。重命名此文件夹中的文件“Rblas.dll.0”和“Rlapack.dll.0” 分别连接到Rblas.dll和Rlpack.dll

他们的建议非常有效。我使用RStudio(带有Revolution R)和Revolution R自己的IDE多次来回重命名这些文件,结果总是一样的:BLAS DLL给我
N==40左右,CRAN-R DLL给我
N==100

我可能会回到BLAS,因为在我的测试中,
%*%
的速度快8倍,
svd()
的速度快4倍。这只是使用我的一个内核(由Windows任务管理器的进程选项卡的CPU使用量列验证)


我希望有更好理解的人能写一个更好的答案,因为我还没有真正理解这个问题的全部后果

开始一个干净的会话。我每次都得到100。我的版本:
“R版本2.15.1(2012-06-22)”
“2.15.1”
用于样条曲线。我下载了适用于windows的R 2.14.2,但仍然得到100。启动一个干净的普通会话。很抱歉,请参阅上面的链接,我怀疑您的工作目录中有一个自动加载的会话文件。它可能是一个.rhistore或.Rdata文件。嗯,单击AddComment按钮旁边的“帮助”链接并单击“了解更多…”似乎是唯一合乎逻辑的做法。是的,但是。。。在同一台机器上运行时,如何在不同的重复运行中获得不同的答案@flodel在上文中提出,可能在同一台机器上不同的CPU等上运行不同的运行,但很难想象在一台机器上运行的芯片组会有所不同……我同意。尽管RevolutionR的回答在技术上可能是正确的,但如果英特尔库产生随机变化的结果,那就糟糕了。如果有其他读者安装了R-Enterprise,我很想看到他们运行相同的测试(使用不同的库)。我意识到这个线程已经有一年的历史了,但我想补充一下。在MKL的新革命R7.0(R3.0.2)中可以看到相同(或更糟)的行为。我得到的值差别很大。在这里的问题中,如果我将代码修改为使用
all.equal()
而不是
idential()
,MKL库就可以了。我的问题是:
> sessionInfo()
R version 2.14.2 (2012-02-29)
Platform: x86_64-pc-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] Revobase_6.1.0   RevoMods_6.1.0   RevoScaleR_3.1-0 lattice_0.20-0  
[5] rpart_3.1-51    

loaded via a namespace (and not attached):
[1] codetools_0.2-8   foreach_1.4.0     grid_2.14.2       iterators_1.0.6  
[5] pkgXMLBuilder_1.0 revoIpe_1.0       tools_2.14.2      XML_3.9-1.1      
> require(splines)
Loading required package: splines
> N <- 0
> set.seed(1)
> for (i in 1:100) N <- N + identical(ns(1:10,3),ns(1:10,3))
> N
[1] 32