假设我们在数据库中有5000个用户。用户行有性别列,他/她出生的地方列和状态(已婚或未婚)列。
如何生成满足以下条件的随机子集(假设100个用户):
这些条件独立,即我们不能这样做:
这一代有算法吗?
答案 0 :(得分:2)
细分是否需要精确或近似?通常,如果您要生成这样的样本,那么您正在进行一些统计学研究,因此生成近似样本就足够了。
以下是如何执行此操作:
有一个功能genRandomIndividual()。
每次生成个体时,使用随机函数选择性别 - 男性的概率为40%
再次使用随机函数选择出生地点(只需在0-1区间生成一个实数,如果它落在0-.5,选择美国,如果是.5-.7,那么& K,如果.7- .9然后加拿大,否则澳大利亚)。
使用随机函数选择结婚状态(再次生成0-1,如果0-.7则结婚,否则不生成。)
获得一组特征后,在数据库中搜索满足这些特征的第一个人,将其添加到样本中,并将其标记为已添加到数据库中。一直这样做,你已经完成了样本量。
可能没有满足这些特征的个体。然后,只需生成一个新的随机个体。由于世代是独立的并且根据所需概率生成特征,因此最终您将具有正确大小的样本大小,其中个体根据指定的概率随机生成。
答案 1 :(得分:1)
您可以尝试这样的事情:
我会使用距所需分布的距离平方和作为决定是否交换的指标。
这就是我想到的随机设置。请记住,可能没有与您所追求的分布相匹配的子集。
答案 2 :(得分:1)
请务必注意,您可能无法找到满足这些条件的子集。举个例子,假设您的数据库只包含美国男性,而且只包含澳大利亚女性。显然,您无法生成满足分布约束的任何子集。
答案 3 :(得分:0)
(完全重写了我的帖子(实际上,写了一个新帖子并删除了旧帖子)因为我想到了一种更简单,更有效的方法来做同样的事情。)
我假设你真的想要确切的比例,而不仅仅是平均满足它们。这是一种非常简单的方法,但根据您的数据,可能需要一段时间才能运行。
首先,安排原始数据,以便您可以轻松访问每种类型的组合,即将一群美国男性组合在一起,将未婚美国男性组合在一起,等等。然后,假设您有 p 条件并且想要选择 k 元素,请创建 p 大小为 k 的数组每;一个数组代表一个条件。使每个数组的元素成为该条件的类型,以您需要的比例。因此,在您的示例中,性别数组将包含40名男性和60名女性。
现在,独立地对每个 p 数组进行随机播放(实际上,如果你愿意,你可以保留一个未调整的数组)。然后,对于每个索引 i ,将拾取元素的类型作为索引 i 中的混乱 p 数组的组合,然后选择从原始组中的其余类型中随机选择一种此类型,删除拾取的元素。如果没有剩下该类型的元素,则算法失败,因此重新洗牌并重新开始挑选元素。
要使用它,您需要首先确保条件完全可以满足,否则它将无限循环。说实话,我没有看到一种简单的方法来验证条件是否可以满足,但是如果原始数据中的元素数量与 k 相比较大,并且它们的分布不会太偏斜,应该有解决方案。此外,如果只有几种方法可以满足条件,则可能需要很长时间才能找到条件;虽然该方法将以概率1终止,但是没有上限可以放在运行时间上。
答案 4 :(得分:0)