我想从离散分布中抽出。
我有一个矩阵pi,它由概率向量组成(具有相同的列数,每行的和是1)。
在Python中,我可以执行以下操作
cumsumpi = cumsum(pi, axis = 1)
[bisect.bisect(k, random.rand()) for k in cumsumpi]通过pi给出的概率得到抽签的向量。
现在我想用R重现这一点。我知道R中有“示例”函数,但它似乎使用了一些不同的算法,而不是二等分,所以我得到了不同的绘制,即使我在这两种情况下使用相同的set.seed()。
我使用rpy2在Python语言中获得与在R中完全相同的随机抽奖。
我没有使用random.rand(),而是使用bisect.bisect(k,asarray(robjects.r(‘runif(1)’)来代替cumsumpi中的k
请让我知道,如果有其他函数,而不是样本,在R做同样的事情。
-Joon
编辑:我设法用下面的内容重现了完全相同的图画,但速度很慢。
cumsumpi = t(apply(pi, 1, cumsum))
getfirstindx = function(cumprobs) {
return(which(cumprobs > runif(1))[1])
}
apply(cumsumpi, 1, getfirstindx)发布于 2010-11-07 00:09:16
这里有一种替代方法,可以避免使用apply,而是对操作进行矢量化。初步检查表明,它的速度是原来的两倍,但还需要更详细的探索。
cumsumpi = t(apply(pi, 1, cumsum));
u = runif(nrow(cumsumpi));
max.col((cumsumpi > u) * 1, "first")为了进一步加快速度,可以考虑对计算每行的累积列和的操作进行矢量化。通过在您的R代码上运行分析器,让我知道这一步是否是瓶颈。
发布于 2010-11-06 12:36:41
我无法使您的问题标题与问题正文一致--无论如何,这里有一个与python的二等分完全相同的R函数:
包gtool*s具有与python的二等分几乎相同的二进制搜索功能**binsearch*,,例如,
# 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发布于 2010-11-06 15:34:36
我要找的是findInterval --寻找区间数或指数。:)
https://stackoverflow.com/questions/4111685
复制相似问题