Как реализовать неравномерное распределение вероятностей?
Я пытаюсь реализовать неравномерное распределение вероятностей в генетическом алгоритме.
При реализации генетической программы у меня есть эксперимент, который имеет 3 результата, где каждый результат имеет разные вероятности. Допустим, вероятность одного исхода составляет 0,85, другого - 0,01, а последний - 0,14?
PS: я недавно узнал, что это называется неравномерным распределением вероятности. Я реализую это на Java, может кто-нибудь рассказать теорию, стоящую за неоднородных проб. распространение, а также любые Java-пакеты, реализующие его.
Не стесняйтесь спрашивать меня, если вам нужна дополнительная информация по проблеме!
Заранее спасибо!
3 ответа
Для простого дискретного распределения вы можете написать сэмплер, который будет возвращать ваши результаты с желаемой частотой, используя кумулятивные вероятности.
Random r = new Random();
double v = r.nextDouble();
if (v <= 0.85) { return 0; }
if (v <= 0.86) { return 1; }
return 2;
Это вернет числа 0, 1 и 2 с вероятностью 0,85, 0,01 и 0,14.
Что касается теории неравномерного распределения вероятностей, вы можете начать с этой статьи в Википедии о распределении вероятностей; обратите особое внимание на складные разделы внизу страницы. Вы обнаружите, что существуют десятки неравномерного распределения (как непрерывного, так и дискретного) с различными свойствами.
В вашем конкретном случае лучше получить случайное значение в [0; 100) используя равномерное распределение, а затем проверьте, в какой диапазон он попадает: [0; 85), [85;99), [99, 100)
Исходя из вашего описания, мне кажется, что вы говорите о пропорциональном выборе фитнеса (также известном как выбор колеса рулетки).
http://en.wikipedia.org/wiki/Roulette-wheel_selection
Я думаю, что ответ nailxx - довольно компактное описание того, что вам нужно сделать.
см. также Выбор рулетки в генетических алгоритмах
Алгоритм выбора колеса рулетки
Если я не прав, вот несколько библиотек, которые могут оказаться полезными:
http://www.ee.ucl.ac.uk/~mflanaga/java/Stat.html
http://commons.apache.org/math/apidocs/org/apache/commons/math/random/package-summary.html