【发布时间】:2016-01-27 16:34:11
【问题描述】:
使用其他编程语言加速 R 是一项重大创新,但似乎也很危险。任何统计函数都必须稳定才能使用,给定相同条目的相同结果,例如sum、sd、cor...
我遇到的问题是使用大量数据(10^8 样本)。我使用 RCPP 和 RCPPPARALLEL 版本的 sum 来演示大数据的错误。
#include <Rcpp.h>
using namespace Rcpp;
/********************************************************
* Rcpp inner function :sum
*******************************************************/
// [[Rcpp::export]]
double RCPPSUM(NumericVector x) {
return sum(x);
}
/*** R
library("Rcpp")
library("RcppParallel")
options(digits=22)# showing more details in number
sourceCpp(system.file("tests/cpp/sum.cpp", package = "RcppParallel"))
## Given two function parallelVectorSum (RcppParallel) and vectorSum (C++STL)
## We manipulated a very big vector
x<-rnorm(100000000)
(RSUM<-sum(x))
(RCPP<-RCPPSUM(x))
(RCPPPARALLEL<-parallelVectorSum(x))
(STD<-vectorSum(x))
identical(RSUM,RCPP)
identical(STD,RCPP)
identical(RSUM,RCPPPARALLEL)
identical(RCPP,RCPPPARALLEL)
## Simple checking of stability
v<-0
for(i in 1:100)v[i]<-sum(x)
(mean(v))
(sd(v))
####stable sd =0
for(i in 1:100)v[i]<-vectorSum(x)
(mean(v))
(sd(v))
###stable sd =0
for(i in 1:100)v[i]<-RCPPSUM(x)
(mean(v))
(sd(v))
###stable sd =0
for(i in 1:100)v[i]<-parallelVectorSum(x)
(mean(v))
(sd(v))
##instable sd!=0
*/
我们可以将并行版本限定为不稳定,因此将其排除在外。 RCPP和RSUM哪个结果是真的?
【问题讨论】:
-
请澄清您的问题。
-
同一个函数有不同的结果
-
在对这么多数字求和时,您一定会遇到舍入错误。即使是内置的
sum函数在输入被洗牌时也不会给出相同的答案:identical(sum(x),sum(rev(x)))产生FALSE。