Функция плотности вероятности из статьи, реализованной с использованием C ++, не работает как предполагаемое
-
29-09-2019 - |
Вопрос
Так что я внедряю эвристический алгоритм, и я наткнулся на эту функцию.
У меня есть массив от 1 до n (от 0 до N-1 на C, W / E). Я хочу выбрать ряд элементов, которые я буду копировать на другой массив. Учитывая параметр y, (0 <y <= 1), я хочу иметь распределение чисел, среднее значение которых составляет (y * n). Это означает, что всякий раз, когда я называю эту функцию, это дает мне номер, между 0 и N, а в среднем эти числа y * n.
По словам автора, «L» является случайным числом: 0 <l <n. В моем тестовом коде он в настоящее время генерирует 0 <= l <= n. И у меня был правильный код, но я в течение нескольких часов связываюсь с этим, и мне лень кодировать его обратно.
Таким образом, я закодировал первую часть функции, для y <= 0,5 я установил y до 0,2 и N до 100. Это означает, что он должен был вернуть число от 0 до 99, со средним 20., а результаты не между 0 и n, но некоторые поплавки. И больше, чем меньше, это меньше, этот поплавок.
Это тестовый код C. «X» - это параметр "L".
//hate how code tag works, it's not even working now
int n = 100;
float y = 0.2;
float n_copy;
for(int i = 0 ; i < 20 ; i++)
{
float x = (float) (rand()/(float)RAND_MAX); // 0 <= x <= 1
x = x * n; // 0 <= x <= n
float p1 = (1 - y) / (n*y);
float p2 = (1 - ( x / n ));
float exp = (1 - (2*y)) / y;
p2 = pow(p2, exp);
n_copy = p1 * p2;
printf("%.5f\n", n_copy);
}
А вот и некоторые результаты (5 десятичных декораций):
0.03354
0.00484
0.00003
0.00029
0.00020
0.00028
0.00263
0.01619
0.00032
0.00000
0.03598
0.03975
0.00704
0.00176
0.00001
0.01333
0.03396
0.02795
0.00005
0.00860
Статья:
http://www.scribd.com/doc/3097936/cas-the-cunning-ant-system
Страницы 6 и 7.
Или поиск "CAS: Cunning System" в Google.
Так что я делаю не так? Я не верю, что автор не прав, потому что есть более 5 документов, описывающих эту же функцию.
Все мои интернаты для того, кто мне помогает. Это важно для моей работы.
Спасибо :)
Решение
DMCKEE на самом деле прав, но я подумал, что буду подробно рассмотреть и попытаться объяснить некоторую путаницу здесь. Я мог бы определенно потерпеть неудачу. f_s(l)
, функция, которую у вас есть в вашей симпатичной формуле выше, является функция распределения вероятностей. Это говорит вам, для данного ввода l
между 0 и n вероятность того, что l
Длина сегмента. Сумма (интегральная) для всех значений между 0 и n должна быть равна 1.
График в верхней части страницы 7 смущает эту точку. Это заговорит l
против. f_s(l)
, но вы должны следить за тем, что они ставят на сторону. Вы замечаете, что значения внизу переходят от 0 до 1, но есть коэффициент x n
на стороне, что означает, что l
Значения фактически проходят от 0 до n. Кроме того, на оси Y есть x 1/n
Это означает, что эти значения на самом деле не поднимаются примерно до 3, они доходят до 3/n.
Так что вы будете делать теперь? Ну, вам нужно решить для накопительной функции распределения, интегрируя функцию распределения вероятностей l
Что на самом деле оказывается не очень плохими (я сделал это с Wolfram Mathematica Online Integrator с помощью X для l
и используя только уравнение для y <= .5). Это, однако, использовало неопределенный интеграл, и вы действительно интегрируете x от 0 до l
. Анкет Если мы установим результирующее уравнение, равное некоторой переменной (например, z), целью сейчас должна решить для l
как функция z. z Вот случайное число от 0 до 1. Вы можете попробовать использовать символический решатель для этой части, если хотите (я бы). Тогда вы не только достигли своей цели - иметь возможность выбирать случайность l
С этого распределения вы также достигли нирваны.
Немного больше работы
Я помогу немного больше. Я пытался делать то, о чем я сказал о y <= .5, но символическая система алгебры, которую я использовал, не смог сделать инверсию (может быть в состоянии). Однако тогда я решил попробовать использовать уравнение для .5 <y <= 1. Это оказывается намного проще. Если я изменюсь l
к X в f_s(l)
я получил
y / n / (1 - y) * (x / n)^((2 * y - 1) / (1 - y))
Интеграция этого на X от 0 до l
Я получил (используя онлайн интегратор Mathematica Integrator):
(l / n)^(y / (1 - y))
Это не становится намного приятнее, чем с такими вещами. Если я установите это равным z и решу для l
Я получил:
l = n * z^(1 / y - 1) for .5 < y <= 1
Одна быстрая проверка предназначена для y = 1. В этом случае мы получаем l = n
Независимо от того, что такое z. Все идет нормально. Теперь вы просто генерируете z (случайное число от 0 до 1) и получаете l
Это распространяется по мере того, как вы желаете. Это означает, что мы можем использовать приведенный выше результат, чтобы найти значение для 0 <y <= .5. Мы просто меняемся l
-> n-l
и y
-> 1-y
и получить
n - l = n * z^(1 / (1 - y) - 1)
l = n * (1 - z^(1 / (1 - y) - 1)) for 0 < y <= .5
В любом случае, это должно решить вашу проблему, если я где -то не допустил ошибки. Удачи.
Другие советы
Вы можете неправильно понять, что ожидается от вас.
Учитывая (правильно нормализованный) PDF и желание выбросить случайное распределение в соответствии с ним, вы образуете совокупное распределение вероятностей (CDF) путем интеграции PDF, затем переверните CDF и используете равномерное случайное предикат в качестве аргумента инвертированного функция.
Немного больше деталей.
f_s(l)
это PDF, и был нормализован на [0,n)
.
Теперь вы интегрируете его, чтобы сформировать CDF
g_s(l') = \int_0^{l'} dl f_s(l)
Обратите внимание, что это определенный интеграл на неопределенную конечную точку, которую я позвонил l'
. Анкет CDF соответственно является функцией l'
. Анкет Предполагая, что у нас есть право нормализации, g_s(N) = 1.0
. Анкет Если это не так, чтобы применить простой коэффициент, чтобы исправить его.
Далее переверните CDF и позвоните в результате G^{-1}(x)
. Анкет Для этого вы, вероятно, захотите выбрать определенную ценность гаммы.
Затем бросить равномерное случайный номер на [0,n)
, и используйте их в качестве аргумента, x
, к G^{-1}
. Анкет Результат должен лгать между [0,1)
, и следует распределить в соответствии с f_s
.
Как и Джастин сказал, вы можете использовать систему компьютерной алгебры для математики.
Учитывая, что для любых значений l, y, n, как описано, термины, которые вы называете P1 и P2, находятся как в [0,1), а экспресс находится в [1, ..) POW (P2, Exp) также в [0, 1) Таким образом, я не вижу, как вы когда -либо получали вывод с диапазоном [0, n)