Функция плотности вероятности из статьи, реализованной с использованием C ++, не работает как предполагаемое

StackOverflow https://stackoverflow.com/questions/4103477

Вопрос

Так что я внедряю эвристический алгоритм, и я наткнулся на эту функцию.

У меня есть массив от 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)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top