Алгоритм может быть слишком сильным словом, поскольку для меня подразумевается формализм и публикация, но существует способ выбора подмножеств с точными пропорциями (при условии, что ваши проценты дают целые числа предметов из выборки вселенной) и это намного проще, чем другие предлагаемые решения. Я построил один и протестировал его.
Кстати, я сожалею, что здесь медленный ответчик, но мое время ограничено в наши дни. Я написал жестко закодированное решение довольно быстро, и с тех пор я реорганизовал его в достойную реализацию общего назначения. Поскольку я был занят, это все еще не завершено, но я больше не хотел откладывать ответ.
Метод:
В принципе, вы будете рассматривать каждую строку отдельно, и решить, является ли она выбирается на основе дают ли ваши критерии Вам возможность выбора каждому из значений столбцов.
Для этого вы будете рассматривать каждое из своих правил столбцов (например, 40% мужчин, 60% женщин) в качестве отдельной цели (например, при желаемом размере подмножества 100, которое вы ищете 40 мужчин, 60 женщин). Сделайте счетчик для каждого.
Затем вы зацикливаете до тех пор, пока вы не создадите подмножество, или вы не проверили все строки в юниверсе выборки, не найдя соответствия (см. Ниже, что происходит тогда). Это петля в псевдокоде:
- Randomly select a row.
- Mark the row examined.
- For each column constraint:
* Get the value for the relevant column from the row
* Test for selectability:
If there's a value target for the value,
and if we haven't already selected our target number of incidences of this value,
then the row is selectable with respect to this column
* Else: the row fails.
- If the row didn't fail, select it: add it to the subset
В этом суть. Он предоставит подмножество, которое соответствует вашим правилам, или оно не сможет этого сделать ..., что подводит меня к тому, что происходит, когда мы не можем найти матч .
невыполнимости:
Как уже отмечалось, это не всегда возможно удовлетворить любой произвольный набор правил для произвольной выборки вселенной. Даже если предположить, что правила действительны (проценты для каждой суммы значений равны 100), размер подмножества меньше размера юниверса, а юниверс содержит достаточно людей с каждым выбранным значением для достижения целей, все равно можно сбой, если значения фактически не распределяются независимо.
Рассмотрите случай, когда все самцы в выборной вселенной являются австралийскими: в этом случае вы можете выбрать только столько мужчин, сколько сможете выбрать австралийцев, и наоборот. Таким образом, набор ограничений (размер подмножества: 100, мужчина: 40%, австралийский 10%) не может быть удовлетворен вообще из такой вселенной, даже если все австралийцы, которых мы выбираем, являются мужчинами.
Если мы сменим ограничения (размер подмножества: 100; мужчина: 40%, австралийский 40%), теперь мы можем создать соответствующее подмножество, но все австралийцы, которых мы выбираем, должны быть мужчинами. И если мы снова изменим ограничения (размер подмножества: 100, мужчина: 20%, австралийский 40%), теперь мы можем сделать соответствующее подмножество, но только если мы не заберем слишком много австралийских женщин (не более половины Это дело).
В этом последнем случае порядок выбора будет иметь значение. В зависимости от нашего случайного семени иногда мы можем добиться успеха, и иногда мы можем потерпеть неудачу.
По этой причине алгоритм должен (и моя реализация) быть подготовлен к повторной попытке. Я думаю об этом как о тесте на терпение: вопрос в том, сколько раз мы хотим, чтобы он потерпел неудачу, прежде чем мы решим, что ограничения не совместимы с выборкой.
Пригодность
Этот метод хорошо подходит для задачи ОП, как описано: выбор случайного подмножества, который соответствует заданным критериям. Не подходит для ответа на несколько иной вопрос: «это возможно, чтобы сформировать подмножество с заданными критериями».
Мои рассуждения об этом просты: ситуации, в которых алгоритм не может найти подмножество, - это те, в которых данные содержат неизвестные связи, или где критерии допускают очень ограниченное число подмножеств из образца юниверса. В этих случаях использование любого подмножества было бы сомнительным для статистического анализа, по крайней мере, не без дальнейших размышлений.
Но для ответа на вопрос о том, возможно ли сформировать подмножество, этот метод является недетерминированным и неэффективным. Было бы лучше использовать один из более сложных алгоритмов shuffle-and-sort, предложенных другими.
Pre-Validation:
Непосредственная мысль, обнаружив, что не все подмножества могут быть выполнены, чтобы выполнить некоторую первоначальную проверку, и, возможно, проанализировать данные, чтобы увидеть, является ли оно отвечает, или только условно подотчетно.
Мое положение состоит в том, что, кроме первоначальной проверки правильности каждого из правил столбца (т. Е. Сумма процентов столбцов равна 100 или почти достаточно) и что размер подмножества меньше размера юниверса, валидация, которую стоит делать. Можно сделать аргумент, что вы можете проверить, что юниверс содержит достаточно людей с каждым выбранным значением (например, на самом деле на самом деле 40 мужчин и 60 женщин во вселенной), но я этого не реализовал.
Кроме того, любой анализ для определения связей в населении сам по себе является отнимающим много времени, чтобы вам лучше было обслуживать только что-то с большим количеством попыток. Может быть, это просто моя нехватка статистики.
Не совсем проблема подмножество сумма
Было высказано предположение, что эта проблема как subset sum problem. Я утверждаю, что это тонко и все же значительно отличается. Мое рассуждение таково: для проблемы суммы подмножества вы должны сформировать и протестировать подмножество, чтобы ответить на вопрос о том, соответствует ли оно правилам: невозможно (за исключением некоторых краевых условий) проверить отдельный элемент перед добавлением это подмножество.
Для вопроса ОП, однако, это возможно. Как я объясню, мы можем случайным образом выбирать строки и тестировать их индивидуально, потому что каждый из них имеет вес один.
Одним из способов было бы сгенерировать все подмножества размером 100 и отклонить все те, которые не соответствуют критерию. Затем от тех, которые у вас остались, выберите их наугад. Не уверен, что есть эффективный способ генерации всех этих подмножеств. –