生成给定概率的伪人口样本

时间:2012-06-07 23:15:07

标签: c cocoa random distribution sample

我想生成符合实际采样数据分布的伪数据。在C / Obj-C中寻找一种高效准确的iphone开发方法。目前,已经为1000个采样事件中的60个不同类别的出现分配了概率(0-1)。我想生成1000个符合相同概率的新事件。

澄清{

我有一个{1,2,...,60}集的分类。据我所知,此分布的样本将符合每个类别的概率。因此,我需要从此分布中获取1000个样本。我已经确定(感谢迄今为止的答案)我需要:

  1. 通过对值进行求和并将每个值相除来对此分布进行归一化 总和。

  2. 订购它们。

  3. 通过将每个值替换为所有先前值的总和来创建CDF。

  4. 然后,我可以生成0到1之间的均匀随机数,并在CDF中找到其值小于或等于刚刚选择的数字的最大数字,并返回与此CDF值对应的类别。

    }

  5.  的 Q1 即可。这是解决问题的正确方法吗?

    Q2 即可。需要注意的是,我正在使用NSDecimals来存储类别概率。 Cocoa或Math.h中是否有可用的库或函数,我可以用它来做到这一点?我愿意尝试新的库,目前在这个项目中只有Core-Plot和标准的Cocoa库。感谢。

2 个答案:

答案 0 :(得分:1)

您的问题描述不清楚。但听起来你正在寻找inverse transform sampling

基本上,您首先需要生成与原始数据相对应的cumulative distribution function (CDF);称之为F(x)。然后生成0-> 1范围内的均匀随机数据,然后使用逆CDF对其进行变换,即F -1 (x)。

答案 1 :(得分:0)

这是我的建议。这假设当你说“归一化概率”时,你的意思是所有类型的概率之和为1.(如果不是,你需要重新缩放,以便就是这种情况。)

  • 为您的60种类型订购一些订单。 (比方说,字母。)
  • 生成0到1之间的随机数。(将其称为“目标”。)
  • 创建一个累加器,最初为0。
  • 循环使用60种类型。对于每种类型:
    • 将此类事件的概率添加到累加器。
    • 如果您的累加器是> =您的目标,请生成该类型的事件并停止。

如果你这样做1000次,我相信你会得到你正在寻找的发行版。