抽样分布
Sampling distribution
假设我有一些由如下概率定义的分布 [0.1, 0.6, 0.2, 0.1]
。概率之和等于1。我想知道如何对这个分布进行抽样,这样抽样就会服从分布。
假设 Node.JS 的 PRNG 遵循均匀分布,一个简单的解决方案可能是这个:
var v = Math.random(); // return a number between 0 and 1
if(v < 0.1)
// first value
else if(v < 0.7) // (0.1 + 0.6)
// second value
else if(v < 0.9) // (0.1 + 0.6 + 0.2)
// third value
else
// forth value
这里已经回答了这个问题(提出的解决方案更通用,因为他们提出了一个可以接受概率数组的函数):
distributional sampling in Node.js
这取决于你的分布是离散的还是连续的。对于连续情况,您必须在两个值之间进行线性插值。这是伪代码
- 设
u
为0
和1
之间的随机数
- 让
i
使得p[i] <= u <= p[i+1]
- Return
(x[i+1] - x[i]) / (p[i+1] - p[i]) * (u - p[i]) + x[i]
请注意,在 2 中可能没有这样的 i
,原因有二:(a) u < p[1]
或 (b) p[n] < u
(我假设 1
为基础的数组)。案例(a) return x[1]
案例(b) x[n]
.
假设我有一些由如下概率定义的分布 [0.1, 0.6, 0.2, 0.1]
。概率之和等于1。我想知道如何对这个分布进行抽样,这样抽样就会服从分布。
假设 Node.JS 的 PRNG 遵循均匀分布,一个简单的解决方案可能是这个:
var v = Math.random(); // return a number between 0 and 1
if(v < 0.1)
// first value
else if(v < 0.7) // (0.1 + 0.6)
// second value
else if(v < 0.9) // (0.1 + 0.6 + 0.2)
// third value
else
// forth value
这里已经回答了这个问题(提出的解决方案更通用,因为他们提出了一个可以接受概率数组的函数): distributional sampling in Node.js
这取决于你的分布是离散的还是连续的。对于连续情况,您必须在两个值之间进行线性插值。这是伪代码
- 设
u
为0
和1
之间的随机数 - 让
i
使得p[i] <= u <= p[i+1]
- Return
(x[i+1] - x[i]) / (p[i+1] - p[i]) * (u - p[i]) + x[i]
请注意,在 2 中可能没有这样的 i
,原因有二:(a) u < p[1]
或 (b) p[n] < u
(我假设 1
为基础的数组)。案例(a) return x[1]
案例(b) x[n]
.