一尘不染

如何生成与直方图匹配的点?

algorithm

我正在研究一个模拟系统。我很快将获得几个模拟输入的真实值分布的实验数据(直方图)。

当模拟运行时,我希望能够产生与测量分布相匹配的随机值。我更愿意不存储原始直方图。有哪些好的方法

  1. 将直方图映射到代表分布的一组参数?
  2. 在运行时基于这些参数生成值?

编辑:输入数据是几种不同类型事件的事件持续时间。我希望不同的类型具有不同的分发功能。


阅读 213

收藏
2020-07-28

共1个答案

一尘不染

至少两个选择:

  1. 积分直方图并进行数值反转。
  2. 拒绝

数值积分

摘自William R.Gibbs的《现代物理学计算》

人们总是可以对[函数]进行数值积分,然后将[ cdf ] 求反,但这通常不是很令人满意,特别是在 pdf 迅速变化的情况下。

您实际上将建立一个表,将该表转换[0-1)为目标分布中的适当范围。然后抛出您惯用的(高质量)PRNG,并与表格一起翻译。它很麻烦,但清晰,可行且完全通用。

拒绝:

归一化目标直方图,然后

  1. 掷骰子以x在范围内随机选择一个位置()。
  2. 如果新的随机数小于此bin中的归一化直方图,则再次抛出并选择此点。否则转到(1)。

再次,头脑简单,但清晰而有效。分布速度很慢,概率很低(峰尾较长)。


使用这两种方法时,如果不需要阶跃函数直方图,则 可以 使用分段多项式拟合或样条曲线近似数据以生成平滑曲线-但留待以后使用,因为这可能是过早的优化。


对于特殊情况,可能存在更好的方法。

所有这些都是非常标准的,如果需要更多详细信息,则应出现在任何《数值分析》教科书中。

2020-07-28