Самокорректирующееся распределение вероятностей - Сохраняйте случайность, тяготея к частоте каждого результата в направлении его вероятности. - PullRequest
0 голосов
/ 19 октября 2018

Это распространенная проблема, когда вы хотите ввести случайность, но в то же время вы хотите, чтобы ваш эксперимент придерживался предполагаемого распределения вероятностей, и не можете / не хотите рассчитывать на закон больших чисел.

Допустим, вы запрограммировали монету с вероятностью 50-50 для головы / хвоста.Если вы смоделируете это 100 раз, скорее всего, вы получите что-то близкое к предполагаемому 50-50 (двоичное распределение с центром в 50-50).

Но что, если вы хотите подобную достоверность для любого числа повторенийэксперимент.

Наш клиент спросил нас об этом:

Возможно, нам также понадобится добавить некоторые ограничения на некоторые рандомизации (например, если пространственное расположение наших стимулов совершенно случайнопрограмма может выдавать слишком много стимулов в одних местах и ​​не очень много в других. Местоположения должны быть одинаково выбраны, поэтому больше массива, который перетасовывается вместо рандомизации с заменой).

Так онихотел случайности, которую они могли контролировать.

1 Ответ

0 голосов
/ 19 октября 2018

За исключением деталей реализации (массивы, против других методов), желаемый результат для проблемы нашего клиента был следующим: *

Всегда иметь как можно ближе к 1 / N стимулов в каждом изN потенциальных локаций, но делайте это случайным образом (трудно предсказать).

Это обычно требуется в играх (при распределении объектов, персонажей, статистики, ...), и я быпредставьте себе множество других приложений.


Мой предпочтительный метод для решения этой проблемы - динамическое взвешивание предполагаемых вероятностей в зависимости от того, как далеко продвинулся эксперимент.Это эффективно отодвигает нас от независимо нарисованных переменных.

  1. Пусть p [i] будет искомой вероятностью результата i
  2. Пусть N [i] будет количеством раз, которое у меня будет результатпроизошло до сих пор
  3. Пусть N будет суммой N [] для всех результатов i
  4. Пусть w [i] будет корректирующим весом для i
  5. Пусть W_Max будетмаксимальный вес, который вы хотите присвоить (т. е. когда результат произошел 0 раз)
  6. Пусть P [i] будет ненормированной вероятностью для i
  7. Тогда p_c [i] является скорректированной вероятностью дляi

p [i] исправлен и предусмотрен проектом.N [i] - это накопление - каждый раз, когда происходит i, приращение N [i] на 1.

w [i] задается как

w[i] = CalculateWeight(p[i], N[i], N, W_Max)
{
    if (N == 0) return 1;
    if (N[i] == 0) return W_Max;

    intended = p[i] * N
    current = N[i]

    return intended / current;
}

И P [i] задаетсяна

P[i] = p[i] * w[i]

Затем мы вычисляем p_c [i] как

p_c[i] = P[i] / sum(P[i])

И запускаем следующую итерацию нашего случайного эксперимента (выборки) с p_c [i] вместо p [i] для результата i.

Главный недостаток - то, что вы торгуете для предсказуемости.После 4 хвостов подряд весьма вероятно, что вы увидите головку.


Примечание 1 :: Описанный метод обеспечит на любом этапе распределение, близкое к оригинальному, если результаты эксперимента соответствуют предполагаемымрезультаты или отклонены к (отдаленным) результатам, которые произошли меньше (больше), чем предполагалось.


Примечание 2 :: Вы можете ввести «контрольный» параметр c и добавить дополнительный шаг.

p_c2[i] = c * p_c[i] + (1-c) * p[i]

Для c = 1 по умолчанию используется описанный метод, для c = 0 - по умолчанию исходные вероятности (независимо нарисованные переменные).

...