小编cha*_*u13的帖子

计算矢量正态分布的cdf的最快方法 - R :: pnorm vs erfc vs?

我希望我的重写问题现在符合Stackoverflow的标准.请考虑以下示例.我正在编写一个Log-Likelihood函数,其中计算cdf over vectors是最耗时的部分.示例1使用R::pnorm,示例2近似于正常cdf erfc.正如您所看到的结果非常相似,ercf版本更快一点.

实际上(在MLE中)然而事实证明,ercf并不精确,这使得算法可以进入inf区域,除非准确地设置约束.我的问题:

1)我错过了什么吗?是否有必要实现一些错误处理(对于erfc)?

2)您是否有任何其他建议来加快代码或替代方案?考虑并行化for循环是否有回报?

require(Rcpp)
require(RcppArmadillo)
require(microbenchmark)

#Example 1 : standard R::pnorm
src1 <- '
NumericVector ppnorm(const arma::vec& x,const arma::vec& mu,const     arma::vec& sigma, int lt, int lg) {
int n = x.size();
arma::vec res(n);
for (int i=0; i<n; i++) {
   res(i) = R::pnorm(x(i),mu(i),sigma(i),lt,lg);
}
return wrap(res);
}
'

#Example 2: approximation with ercf
src2 <- '
NumericVector ppnorm(const arma::vec& x,const arma::vec& mu,const    arma::vec& sigma, int lt, int lg) {
int n = x.size();
arma::vec …
Run Code Online (Sandbox Code Playgroud)

c++ r armadillo rcpp

13
推荐指数
1
解决办法
1526
查看次数

Assignment of a value from a foreach loop

I would like to parallelize a loop like

td        <- data.frame(cbind(c(rep(1,4),2,rep(1,5)),rep(1:10,2)))
names(td) <- c("val","id")

res <- rep(NA,NROW(td))
for(i in levels(interaction(td$id))){
res[td$id==i] <- mean(td$val[td$id!=i])
}  
Run Code Online (Sandbox Code Playgroud)

with the help of foreach() of the library(doParallel) in order to speed up computations. Unfortunately foreach doesn't seem to support direct assignments, at least

registerDoParallel(4)
res <- rep(NA,NROW(td))
foreach(i=levels(interaction(td$id))) %dopar%{
res[td$id==i] <- mean(td$val[td$id!=i])}
Run Code Online (Sandbox Code Playgroud)

不做我想要的(给出与上面的正常循环相同的结果).任何想法我做错了什么或我怎么能以某种方式"破解" foreach中的.combine选项以便做我想要的?请注意,id变量的顺序在原始数据集中并不总是相同.任何提示都将非常感谢!

parallel-processing foreach r

7
推荐指数
2
解决办法
2178
查看次数

R - seek中的模糊融合有助于提高我的代码

受到statar包中的实验fuzzy_join函数的启发,我自己编写了一个函数,它结合了精确和模糊(通过字符串距离)匹配.我必须做的合并工作非常大(导致多个字符串距离矩阵,小于10亿个单元格),我的印象是函数编写效率不高(关于内存使用情况)和并行化以奇怪的方式实现(字符串距离矩阵的计算,如果存在多个模糊变量,而不是字符串距离本身的计算并行化).至于功能,想法是在可能的情况下匹配精确变量(以保持矩阵更小),然后在这个精确匹配的组内进行模糊匹配.我实际上认为这个功能是不言自明的.我在这里发布它是因为我希望得到一些反馈来改进它,因为我想我并不是唯一一个尝试在R中做类似事情的人(虽然我承认Python,SQL和类似的东西可能在这种情况下要更有效率.但是必须坚持一个人感觉最舒服的事情,并且使用相同的语言进行数据清理和准备在再现性方面是很好的) fuzzy_joinfuzzy_join

merge.fuzzy = function(a,b,.exact,.fuzzy,.weights,.method,.ncores) {
    require(stringdist)
    require(matrixStats)
    require(parallel)

    if (length(.fuzzy)!=length(.weights)) {
        stop(paste0("fuzzy and weigths must have the same length"))
    }

    if (!any(class(a)=="data.table")) {
        stop(paste0("'a' must be of class data.table"))
    }

    if (!any(class(b)=="data.table")) {
        stop(paste0("'b' must be of class data.table"))
    }

    #convert everything to lower
    a[,c(.fuzzy):=lapply(.SD,tolower),.SDcols=.fuzzy]
    b[,c(.fuzzy):=lapply(.SD,tolower),.SDcols=.fuzzy]

    a[,c(.exact):=lapply(.SD,tolower),.SDcols=.exact]
    b[,c(.exact):=lapply(.SD,tolower),.SDcols=.exact]

    #create ids
    a[,"id.a":=as.numeric(.I),by=c(.exact,.fuzzy)]
    b[,"id.b":=as.numeric(.I),by=c(.exact,.fuzzy)]


    c <- unique(rbind(a[,.exact,with=FALSE],b[,.exact,with=FALSE]))
    c[,"exa.id":=.GRP,by=.exact]

    a <- merge(a,c,by=.exact,all=FALSE)
    b <- merge(b,c,by=.exact,all=FALSE)

    ##############

    stringdi <- function(a,b,.weights,.by,.method,.ncores) {
        sdm      <- list()

        if (is.null(.weights)) {.weights <- …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r fuzzy-comparison data.table stringdist

6
推荐指数
0
解决办法
580
查看次数

将函数应用于数据表子集,不包括嵌套值

我有一个与此问题相关的问题,我之前曾问过:从foreach循环中赋值.我发现尽管友好用户提供的解决方案指向了正确的方向,但它们并没有解决我的实际问题.这里是示例数据集:

td <- data.table(date=c(rep(1,10),rep(2,10)),var=c(rep(1,4),2,rep(1,5)),id=rep(1:10,2))
Run Code Online (Sandbox Code Playgroud)

它与以前相同,但它更好地反映了我的真实数据我想用文字做什么:对于每个id,我想在一定时期内得到所有其他id的均值(例如mean(td [date =="2004] -01-01"&id!= 1] $ var)但是适用于所有期间和所有ID).所以它是某种嵌套操作.我试过这样的事情:

td[,.SD[,mean(.SD$var[-.I]),by=id],by=date]
Run Code Online (Sandbox Code Playgroud)

但这并没有给出正确的结果.

r data.table

5
推荐指数
1
解决办法
240
查看次数

对 Dask 数组的列应用函数

将函数应用于 Dask 数组的每一列的最有效方法是什么?如下所述,我已经尝试了很多方法,但我仍然怀疑我对 Dask 的使用相当业余。

\n

我有一个相当宽且相当长的数组,大小约为 3,000,000 x 10,000。我想将 ecdf 函数应用于该数组的每一列。堆叠在一起的各个列结果应生成与输入数组具有相同维度的数组。

\n

考虑以下测试,让我知道哪种方法是理想的方法或者我可以如何改进。我知道,我可以只使用最快的,但我真的想最大限度地利用 Dask 的可能性。阵列也可以大数倍。与此同时,我的基准测试结果令我感到惊讶。也许我没有正确理解 Dask 背后的逻辑。

\n
import numpy as np\nimport dask\nimport dask.array as da\nfrom dask.distributed import Client, LocalCluster\nfrom statsmodels.distributions.empirical_distribution import ECDF\n\n### functions\ndef ecdf(x):\n    fn = ECDF(x)\n    return fn(x)\n\ndef ecdf_array(X):\n\n    res = np.zeros_like(X)\n    for i in range(X.shape[1]):\n        res[:,i] = ecdf(X[:,i])\n        \n    return res\n\n### set up scheduler / workers\nn_workers = 10\ncluster = LocalCluster(n_workers=n_workers, threads_per_worker=4)\nclient = Client(cluster)\n\n### create data set \nX = da.random.random((100000,100)) #dask\nXarr = X.compute() #numpy\n\n### traditional for loop\n%timeit …
Run Code Online (Sandbox Code Playgroud)

python dask dask-delayed dask-distributed dask-dataframe

5
推荐指数
1
解决办法
682
查看次数

提高性能 - 摆脱.SD?

桌上大师!这是我几天前在这里发布的一个问题的后续问题.我正在向您提出一个问题,如何提高以下应用程序的性能data.table:

功能(为了设想尽可能最快的目的):

prob <- function(a, ie1, b, a1, ie2, b2, ...) {
ipf  <- function(a, b, ...) {
m    <- length(a)
n    <- length(b)
if (m < n) {
    r <- rank(c(a, b), ...)[1:m] - 1:m
} else {
    r <- rank(c(a, b), ...)[(m + 1):(m + n)] - 1:n
}
s <- ifelse((n + m)^2 > 2^31, sum(as.double(r)), sum(r))/(as.double(m) * n)
return(ifelse(m < n, s, 1 - s))
}

expand.grid.alt <- function(seq1, seq2) {
cbind(rep.int(seq1, …
Run Code Online (Sandbox Code Playgroud)

r data.table

-3
推荐指数
1
解决办法
156
查看次数