0

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

澄清{

我有一个集合 {1,2,...,60} 的分类分布。我了解此分布中的样本将符合每个类别的概率。因此我需要从这个分布中抽取 1000 个样本。我已经确定(感谢到目前为止的答案)我需要:

  1. 通过对这些值求和并将每个值除以总和来规范化此分布。

  2. 订购它们。

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

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

    }

Q1。这是解决问题的正确方法吗?

Q2。需要注意的是,我使用 NSDecimals 来存储类别概率。Cocoa 或 Math.h 等中是否有任何可用的库或函数可以用来简单地执行此操作?我愿意尝试新的库,目前这个项目中只有 Core-Plot 和标准 Cocoa 库。谢谢。

4

2 回答 2

1

您的问题描述不清楚。但听起来你正在寻找逆变换采样

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

于 2012-06-08T00:12:15.753 回答
0

这是我的建议。这假设当您说“归一化概率”时,您的意思是所有类型的概率之和为 1。(如果不是,您需要重新调整比例,这样就可以了。)

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

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

于 2012-06-07T23:28:51.790 回答