询问满足属性占比要求的样本选择算法及数据库样本筛选方案
满足多约束条件的抽样算法:可行,但需结合数据实际
当然存在这类算法,但能不能找到符合要求的样本组,还得看你数据库里people表的原始数据分布——毕竟巧妇难为无米之炊,如果原始数据里蓝眼睛男性且有特定子女数的群体占比极低,那可能凑不出满足所有约束的样本。
一、问题本质:带多约束的分层抽样
你的需求属于带硬约束+软约束的分层随机抽样问题:
- 硬约束:样本子女总数必须落在19-21之间
- 软约束:眼睛颜色、性别占比需在目标值±5%的误差范围内(比如蓝眼睛占比25%-35%,男性占比35%-45%)
二、两种可行的算法思路
1. 迭代调整抽样法(实操性强,适合中小数据量)
这是最容易落地到业务中的方法,步骤大概是:
- 第一步:先估算大致样本量。比如假设数据库中人员的平均子女数是k,那样本量大概在
20/k左右(比如平均每个有2个孩子,样本量就在10人上下)。再根据性别、眼睛颜色的目标占比,初步抽取各分层的人员(比如10人里,蓝眼睛3人、绿眼睛2人、棕眼睛5人;男性4人、女性6人)。 - 第二步:计算当前样本的核心指标:子女总数、各眼睛颜色占比、各性别占比,和目标约束对比。
- 第三步:针对性调整样本。比如子女总数超了,就随机把一个子女数多的样本换成子女数少的;蓝眼睛占比不够,就把一个非蓝眼睛样本换成蓝眼睛的,同时尽量不破坏其他已经达标的约束。
- 第四步:重复第二步到第三步,直到所有约束都满足,或者迭代了足够多次(比如1000次)仍不满足,就判定不存在符合要求的样本。
2. 整数规划法(精确判断,适合需要严谨结论的场景)
如果需要精准判断是否存在可行解,可以把问题转化为整数规划模型:
- 变量:给每个人员设置一个0-1变量(1表示选中该人员,0表示不选)
- 约束条件:
- 所有选中人员的
number_of_children之和 ∈ [19, 21] - 选中的蓝眼睛人数 / 总样本数 ∈ [0.25, 0.35]
- 选中的绿眼睛人数 / 总样本数 ∈ [0.15, 0.25]
- 选中的棕眼睛人数 / 总样本数 ∈ [0.45, 0.55]
- 选中的男性人数 / 总样本数 ∈ [0.35, 0.45]
- 所有选中人员的
- 目标:最小化所有约束的偏差值(或者直接判断是否存在可行解)
然后用整数规划求解器(比如PuLP、Gurobi)来计算。这种方法能准确告诉你是否存在符合要求的样本,但数据量较大时,计算成本会比较高。
三、怎么判断不存在符合要求的样本?
如果出现以下情况,基本可以确定找不到满足所有约束的样本:
- 原始数据中某类群体的占比远低于约束下限:比如数据库里蓝眼睛的人只有10%,那根本不可能抽到占比25%-35%的样本
- 约束之间存在逻辑冲突:比如所有蓝眼睛的人都是男性,而目标要求男性占40%、蓝眼睛占30%——这意味着蓝眼睛男性至少要占30%,剩下的10%男性必须是非蓝眼睛,如果原始数据里没有非蓝眼睛的男性,那这个约束就无法满足
- 子女总数约束和样本量取整冲突:比如目标子女总数是19-21,而所有人员的子女数都是3,那样本量只能是7(总子女数21),但7人的话,男性占40%是2.8人,无法取整,自然满足不了性别占比约束
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

