我想从离散分布中得出。
我有一个矩阵pi,它由概率向量组成(列数相同,每行总和为1)。
在Python中,我可以执行以下操作
cumsumpi = cumsum(pi, axis = 1)
[bisect.bisect(k, random.rand()) for k in cumsumpi]
通过pi给出的概率得到绘制矢量。
现在我想用R重现这一点。我知道R中有“sample”函数,但似乎它使用了一些不同的算法然后平分,所以我得到了不同的绘制,即使我使用相同的set.seed()在这两种情况下。
我使用rpy2在Python中获得与R中完全相同的随机抽取。例如,
而不是random.rand(),我用过 [bisect.bisect(k,asarray(robjects.r('runif(1)')))for cums in cumsumpi]
如果R中的样品还有其他功能,请告诉我相同的事情。
-Joon
编辑: 我设法使用以下内容重现完全相同的绘制,但速度很慢。
cumsumpi = t(apply(pi, 1, cumsum))
getfirstindx = function(cumprobs) {
return(which(cumprobs > runif(1))[1])
}
apply(cumsumpi, 1, getfirstindx)
答案 0 :(得分:2)
这是一种替代方法,它避免使用apply而是对操作进行矢量化。初步检查表明它的速度是原来的两倍,但需要详细探讨。
cumsumpi = t(apply(pi, 1, cumsum));
u = runif(nrow(cumsumpi));
max.col((cumsumpi > u) * 1, "first")
为了进一步加快速度,可以考虑对计算每行累积列总和的操作进行矢量化。通过在R代码上运行探查器,让我知道该步骤是否是瓶颈。
答案 1 :(得分:0)
我无法将你的问题的标题与问题主体调和 - 无论如何,这里的R函数与python的bisect相同:
包 gtool * 有一个二进制搜索功能,* * binsearch * ,几乎与python的bisect相同,例如,
# search for 25 in the range 0 through 100
> binseaerch(fun = function(x) x - 25, range=c(0, 100))
$call
binsearch(fun = function(x) x - 25, range = c(0, 100))
$numiter
[1] 2
$flag
[1] "Found"
$where
[1] 25
$value
[1] 0
答案 2 :(得分:0)
我在寻找的是findInterval - 查找间隔号或指数。 :)
答案 3 :(得分:0)
我没有发布,但我最终使用的非常相似:
cumsumpi = t(apply(pi, 1, cumsum))
1 + rowSums(cumsumpi > runif(nrow(pi)))
速度与您的代码几乎相同。如果我知道max.col,我会用它。
根据你的建议,我对cumsum事物进行了矢量化,它给了我非凡的速度提升。谢谢。
-Joon