按规则生成子集

时间:2009-12-19 21:10:06

标签: algorithm sample subset

假设我们在数据库中有5000个用户。用户行有性别列,他/她出生的地方列和状态(已婚或未婚)列。

如何生成满足以下条件的随机子集(假设100个用户):

  • 40%应该是男性,60%应该是女性
  • 50%应该在美国出生,20%出生在英国,20%出生在加拿大,10%出生在澳大利亚
  • 70%应该结婚,30%不结婚。

这些条件独立,即我们不能这样做:

  • (0.4 * 0.5 * 0.7)* 100 = 14名男性用户,在美国出生并已婚
  • (0.4 * 0.5 * 0.3)* 100 = 6名男性用户,在美国出生但未婚。

这一代有算法吗?

5 个答案:

答案 0 :(得分:2)

细分是否需要精确或近似?通常,如果您要生成这样的样本,那么您正在进行一些统计学研究,因此生成近似样本就足够了。

以下是如何执行此操作:

有一个功能genRandomIndividual()。

每次生成个体时,使用随机函数选择性别 - 男性的概率为40%

再次使用随机函数选择出生地点(只需在0-1区间生成一个实数,如果它落在0-.5,选择美国,如果是.5-.7,那么& K,如果.7- .9然后加拿大,否则澳大利亚)。

使用随机函数选择结婚状态(再次生成0-1,如果0-.7则结婚,否则不生成。)

获得一组特征后,在数据库中搜索满足这些特征的第一个人,将其添加到样本中,并将其标记为已添加到数据库中。一直这样做,你已经完成了样本量。

可能没有满足这些特征的个体。然后,只需生成一个新的随机个体。由于世代是独立的并且根据所需概率生成特征,因此最终您将具有正确大小的样本大小,其中个体根据指定的概率随机生成。

答案 1 :(得分:1)

您可以尝试这样的事情:

  • 选择随机初始设置为100
  • 直到你有正确的分发(或放弃):
    • 选择一个不在集合中的随机记录,以及一个
    • 的随机记录
    • 如果在另一条记录中交换让您更接近您想要的设置,请更换它们。否则,请不要。

我会使用距所需分布的距离平方和作为决定是否交换的指标。

这就是我想到的随机设置。请记住,可能没有与您所追求的分布相匹配的子集。

答案 2 :(得分:1)

请务必注意,您可能无法找到满足这些条件的子集。举个例子,假设您的数据库只包含美国男性,而且只包含澳大利亚女性。显然,您无法生成满足分布约束的任何子集。

答案 3 :(得分:0)

(完全重写了我的帖子(实际上,写了一个新帖子并删除了旧帖子)因为我想到了一种更简单,更有效的方法来做同样的事情。)

我假设你真的想要确切的比例,而不仅仅是平均满足它们。这是一种非常简单的方法,但根据您的数据,可能需要一段时间才能运行。

首先,安排原始数据,以便您可以轻松访问每种类型的组合,即将一群美国男性组合在一起,将未婚美国男性组合在一起,等等。然后,假设您有 p 条件并且想要选择 k 元素,请创建 p 大小为 k 的数组每;一个数组代表一个条件。使每个数组的元素成为该条件的类型,以您需要的比例。因此,在您的示例中,性别数组将包含40名男性和60名女性。

现在,独立地对每个 p 数组进行随机播放(实际上,如果你愿意,你可以保留一个未调整的数组)。然后,对于每个索引 i ,将拾取元素的类型作为索引 i 中的混乱 p 数组的组合,然后选择从原始组中的其余类型中随机选择一种此类型,删除拾取的元素。如果没有剩下该类型的元素,则算法失败,因此重新洗牌并重新开始挑选元素。

要使用它,您需要首先确保条件完全可以满足,否则它将无限循环。说实话,我没有看到一种简单的方法来验证条件是否可以满足,但是如果原始数据中的元素数量与 k 相比较大,并且它们的分布不会太偏斜,应该有解决方案。此外,如果只有几种方法可以满足条件,则可能需要很长时间才能找到条件;虽然该方法将以概率1终止,但是没有上限可以放在运行时间上。

答案 4 :(得分:0)