Как сгенерировать случайные величины с заданной функцией распределения и коэффициентом корреляции??

Ссылка скопирована
1 ответ

Здравствуйте ! Речь идёт о методе Монте Карло . Задана функция распределения случайной величины и коэффициент корреляции между двумя случайными величинами. Как сгенерировать случайные величины с заданной функцией и корреляцией?

Дополнительно:

Ответы:

В общем случае все сложно и тут как с интегрированием надо подходить с воображением и изобретательностью.

Вообще, не для любых функций распределения можно получить любую корреляцию. Например, вы никак не сможете добиться полной (corr=1) корреляции равномерно распределенной величины и нормально распределенной величины.

Но, если функция для обеих величин одинаковая, то есть, например, такой способ:
1) Сгенерируйте случайную величину a согласно функции распределения.
2) C вероятностью k выдайте это же значение как и вторую переменную (b=a).
3) C вероятностью 1-k сгенерируйте случайную величину b согласно той же функции распределения.

Этот способ выдаст коэффициент корреляции k. Если нужна отрицательная корреляция, то можно выдать b=2Ea-a во втором шаге (отражение относительно матожидания). Но тогда в третьем шаге плотность распределения будет уже не такая же как у a. Если заданная функия распределения f(x), то там надо использовать g(x)=(f(x) -kf(2Ea-x))/(1-k). Суть в том, чтобы g(x)*(1-k)+k*f(2Ea-x) = f(x) - и итоговая плотность распределения будет одинаковая.

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

Другой вариант, сгенерировать случайную величину a ~ f(x), потом взять b = k*a+c, где c - это какая-то независимая случайная величина, распределенная как-то хитро (об этом ниже). Регулируя k можно получать разный уровень корреляции. Удобно работать уже с центрированными случайными величинами. Пусть Ea = Eb = Ec= 0.

Тогда коэффициент корреляции будет E((ka+c)a)/D(a) = (kEa^2+Eac)/D(a) = kE(a^2)/D(a) = k. Потому что a и c независимые случайные величины и Eac = Ea*Ec = 0*0. А D(a) = E(a^2)-Ea*Ea = E(a^2)-0*0.

Пусть функция распределения a и b - F(x) (плотность f(x)). Искомая функция для c - G(x) (плотность g(x)).

Надо будет решить интегральное уравнение:
Int -int..inf g(t)f((x-t)/k)/k dt = f(t)

Лучше всего это через преобразование лапласа это решать. Теоремму о свертке и свойство умножения на число примените.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Максим Павлов Ответ

Для генерации случайных величин с заданной функцией распределения и коэффициентом корреляции вам потребуется использовать метод преобразования Бокса-Мюллера для генерации случайных нормально распределенных величин, а затем применить метод преобразования Корелли-Харрелла для достижения необходимого коэффициента корреляции.

Прежде всего, необходимо сгенерировать две последовательности случайных чисел, распределенных по стандартному нормальному закону. Для этого можно воспользоваться методом Бокса-Мюллера, который позволяет из равномерно распределенных случайных чисел получить нормально распределенные.

Пример кода на языке программирования PHP для генерации случайных нормально распределенных величин с помощью метода Бокса-Мюллера:

function generate_normal_random_numbers($n) {
    $random_numbers = [];
 
    for ($i = 0; $i < $n; $i++) {
        $u1 = mt_rand() / mt_getrandmax();
        $u2 = mt_rand() / mt_getrandmax();
 
        $z1 = sqrt(-2 * log($u1)) * cos(2 * pi() * $u2);
        $z2 = sqrt(-2 * log($u1)) * sin(2 * pi() * $u2);
 
        $random_numbers[] = $z1;
        $random_numbers[] = $z2;
    }
 
    return $random_numbers;
}

function generate_normal_random_numbers($n) { $random_numbers = []; for ($i = 0; $i < $n; $i++) { $u1 = mt_rand() / mt_getrandmax(); $u2 = mt_rand() / mt_getrandmax(); $z1 = sqrt(-2 * log($u1)) * cos(2 * pi() * $u2); $z2 = sqrt(-2 * log($u1)) * sin(2 * pi() * $u2); $random_numbers[] = $z1; $random_numbers[] = $z2; } return $random_numbers; }

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

Пример кода на языке программирования PHP для применения метода преобразования Корелли-Харрелла:

function correlate_random_numbers($random_numbers1, $random_numbers2, $correlation) {
    $n = count($random_numbers1);
 
    $correlated_random_numbers = [];
 
    for ($i = 0; $i < $n; $i++) {
        $correlated_random_number = $correlation * $random_numbers1[$i] + sqrt(1 - pow($correlation, 2)) * $random_numbers2[$i];
 
        $correlated_random_numbers[] = $correlated_random_number;
    }
 
    return $correlated_random_numbers;
}

function correlate_random_numbers($random_numbers1, $random_numbers2, $correlation) { $n = count($random_numbers1); $correlated_random_numbers = []; for ($i = 0; $i < $n; $i++) { $correlated_random_number = $correlation * $random_numbers1[$i] + sqrt(1 - pow($correlation, 2)) * $random_numbers2[$i]; $correlated_random_numbers[] = $correlated_random_number; } return $correlated_random_numbers; }

Теперь у вас есть необходимые инструменты для генерации случайных величин с заданной функцией распределения и коэффициентом корреляции. Примените методы Бокса-Мюллера и Корелли-Харрелла в вашем коде, чтобы получить необходимый результат.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно