我正在尝试生成100个范围为[0.005,0.008]的统一随机数,总和为1。我一直在寻找与自己的担忧相关的几个问题,但没有找到答案。
有人可以给我一个建议吗?
最佳答案
首先,我将稍微修改您的示例,假设100个变量的边界为[0.008,0.012],并且它们的总和为1(这可确保您要采样的集合中有可行的点)。
"hit and run" algorithm在n维空间的有界子集中进行均匀采样。对于您的情况,我们有n = 100个尺寸;让我们定义相应的变量x_1, x_2, ..., x_100
。然后,我们有三种类型的约束来限制我们要从中采样的空间区域。
变量的下限为0.008 -可以通过以下线性不等式捕获:
x_1 >= 0.008
x_2 >= 0.008
...
x_100 >= 0.008
变量的上限是0.012 -可以通过以下线性不等式捕获:
x_1 <= 0.012
x_2 <= 0.012
...
x_100 <= 0.012
变量的总和为1 -可以通过以下方式捕获:
x_1 + x_2 + ... + x_100 = 1
假设我们要获取10组在我们的空间内均匀分布的变量。然后,我们可以通过以下方式在R中使用
hitandrun
包:library(hitandrun)
n <- 100
lower <- 0.008
upper <- 0.012
s <- 1
constr <- list(constr = rbind(-diag(n), diag(n), rep(1, n), rep(-1, n)),
dir = rep("<=", 2*n+2),
rhs = c(rep(-lower, n), rep(upper, n), s, -s))
samples <- hitandrun(constr, n.samples=10)
dim(samples)
# [1] 10 100
请注意,这要花很长时间(在我的情况下,不到2小时),因为我们是在高维空间(尺寸n = 100)中进行采样,并且要确保均匀采样,命中并运行算法实际上执行O (n ^ 3)次迭代,绘制每个样本。您可以通过将
thin
参数调整为函数来减少运行时间,尽管这可能会影响绘制的独立性。关于r - 生成N个统一随机数,总和为1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32829457/