2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.



Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 генератор случайных чисел
Сообщение10.10.2011, 15:56 


27/10/09
602
Друзья!
Понадобился генератор случайного вектора размерности $n$. Каждая $i$-я компонента вектора $y(i)$ подчиняется равномерному распределению в диапазоне от $LB(i)$ до $UB(i)$, а сумма всех компонент должна быть равна $A$: $\sum _{i=1}^n y(i)=A$. Как это можно реализовать?

 Профиль  
                  
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 16:08 
Заслуженный участник


04/05/09
4587
Это:
AndreyL в сообщении #491334 писал(а):
Каждая $i$-я компонента вектора $y(i)$ подчиняется равномерному распределению в диапазоне от $LB(i)$ до $UB(i)$

противоречит этому:
AndreyL в сообщении #491334 писал(а):
сумма всех компонент должна быть равна $A$: $\sum _{i=1}^n y(i)=A$

 Профиль  
                  
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 16:09 
Заслуженный участник


09/09/10
3729
Распределение хоть у одной компоненты вектора будет отличным от равномерного. Так что можно сделать что-то вроде
Код:
s := 0;
for i := 1 to n-1 do begin
  y[i] := LB[i] + Random(UB[i]-LB[i]);
  s := s + y[i];
end;
y[n] := A - s;

 Профиль  
                  
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 16:13 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
У меня было какое-то смутное чувство противоречия, но потом я его потерял. Вот две (пусть так) компоненты. Первая распределена равномерно на [1,2]. Вторая равна 3 минус первая. И что?

 Профиль  
                  
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 16:15 


27/10/09
602
Joker_vD в сообщении #491337 писал(а):
Распределение хоть у одной компоненты вектора будет отличным от равномерного. Так что можно сделать что-то вроде
Код:
s := 0;
for i := 1 to n-1 do begin
  y[i] := LB[i] + Random(UB[i]-LB[i]);
  s := s + y[i];
end;
y[n] := A - s;
Тогда y[n] может выйти за пределы своего допустимого диапазона.
Код:
s := 0;
for i := 1 to n do begin
  y[i] := LB[i] + Random(UB[i]-LB[i]);
  s := s + y[i];
end;
y=y/s
тоже не подойдет по той же причине.

-- Пн окт 10, 2011 3:26 pm --

Для наглядности: границы дают гиперкуб (на самом деле прямоугольный гиперпараллелепипед). Этот гиперкуб пересекается гиперплоскостью. Нужно на этой гиперплоскости внутри гиперкуба равномерно нанести точки.

 Профиль  
                  
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 16:28 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
А кто сказал, что компоненты должны быть независимы? Может быть, с зависимыми можно это сделать, а? Надо хотя бы случай трех рассмотреть. Можно ли так подобрать совместное распределение двух с.в. $x$ и $y$ так, чтобы каждая из них была бы равномерно распределена на своем интервале, а также и сумма $x+y$ чтобы тоже оказалась равномерно распределенной.

Надо бы посмотреть, можно ли такое учудить в дискретном случае для начала...

 Профиль  
                  
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 16:37 
Заслуженный участник


04/05/09
4587
ИСН в сообщении #491341 писал(а):
У меня было какое-то смутное чувство противоречия, но потом я его потерял. Вот две (пусть так) компоненты. Первая распределена равномерно на [1,2]. Вторая равна 3 минус первая. И что?
Начиная с трёх равномерность сохранить не получается.

-- Пн окт 10, 2011 09:40:59 --

AndreyL в сообщении #491342 писал(а):
Для наглядности: границы дают гиперкуб (на самом деле прямоугольный гиперпараллелепипед). Этот гиперкуб пересекается гиперплоскостью. Нужно на этой гиперплоскости внутри гиперкуба равномерно нанести точки.
Это можно, но равномерность каждой компоненты выдержать не получится. Если сделать распределения компонент одинаковыми, то чем больше компонент, тем ближе их распределение будет к нормальному.

 Профиль  
                  
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 16:46 
Заслуженный участник


09/09/10
3729
AndreyL в сообщении #491342 писал(а):
Тогда y[n] может выйти за пределы своего допустимого диапазона.

В этом случае вектор генерируется заново. В чем проблема-то?

 Профиль  
                  
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 17:12 


27/10/09
602
Joker_vD в сообщении #491352 писал(а):
AndreyL в сообщении #491342 писал(а):
Тогда y[n] может выйти за пределы своего допустимого диапазона.

В этом случае вектор генерируется заново. В чем проблема-то?


Пока как самый простой и самый долгий вариант.

-- Пн окт 10, 2011 4:13 pm --

Цитата:
Это можно, но равномерность каждой компоненты выдержать не получится. Если сделать распределения компонент одинаковыми, то чем больше компонент, тем ближе их распределение будет к нормальному.


Да, маргинальные распределения компонент вектора уже не будут равномерными.

 Профиль  
                  
 
 Re: генератор случайных чисел
Сообщение10.10.2011, 17:14 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
AndreyL в сообщении #491342 писал(а):
Для наглядности: границы дают гиперкуб (на самом деле прямоугольный гиперпараллелепипед). Этот гиперкуб пересекается гиперплоскостью. Нужно на этой гиперплоскости внутри гиперкуба равномерно нанести точки.


Если на самом деле задача стоит именно так, тогда зачем требовать равномерности самих компонент?

 Профиль  
                  
 
 Re: генератор случайных чисел
Сообщение10.10.2011, 17:18 
Заслуженный участник


09/09/10
3729
AndreyL в сообщении #491362 писал(а):
Пока как самый простой и самый долгий вариант.

Есть и другой: если в результате $y_n > UB_n$, то надо раскидать излишек по остальным компонентам, причем следить, чтобы в компонентах не было переполнения.

 Профиль  
                  
 
 Re: генератор случайных чисел
Сообщение10.10.2011, 17:19 


27/10/09
602
PAV в сообщении #491364 писал(а):
AndreyL в сообщении #491342 писал(а):
Для наглядности: границы дают гиперкуб (на самом деле прямоугольный гиперпараллелепипед). Этот гиперкуб пересекается гиперплоскостью. Нужно на этой гиперплоскости внутри гиперкуба равномерно нанести точки.


Если на самом деле задача стоит именно так, тогда зачем требовать равномерности самих компонент?


В общем случае это невозможно. Ну хорошо, а как тогда?

-- Пн окт 10, 2011 4:43 pm --

Joker_vD в сообщении #491366 писал(а):
AndreyL в сообщении #491362 писал(а):
Пока как самый простой и самый долгий вариант.

Есть и другой: если в результате $y_n > UB_n$, то надо раскидать излишек по остальным компонентам, причем следить, чтобы в компонентах не было переполнения.


И точно так-же поступить, если недостаток. Тогда есть подозрение, что точки начнут локализоваться вблизи больших и меньших границ гиперкуба.

-- Пн окт 10, 2011 4:45 pm --

Joker_vD в сообщении #491352 писал(а):
AndreyL в сообщении #491342 писал(а):
Тогда y[n] может выйти за пределы своего допустимого диапазона.

В этом случае вектор генерируется заново. В чем проблема-то?


И еще проще - генерировать просто равномерно-распределенный вектор, если какая-то компонента выходит за границы, генерировать следующий.

 Профиль  
                  
 
 Re: генератор случайных чисел
Сообщение10.10.2011, 18:54 


23/12/07
1763
AndreyL в сообщении #491368 писал(а):
PAV в сообщении #491364 писал(а):
AndreyL в сообщении #491342 писал(а):
Для наглядности: границы дают гиперкуб (на самом деле прямоугольный гиперпараллелепипед). Этот гиперкуб пересекается гиперплоскостью. Нужно на этой гиперплоскости внутри гиперкуба равномерно нанести точки.


Если на самом деле задача стоит именно так, тогда зачем требовать равномерности самих компонент?

В общем случае это невозможно. Ну хорошо, а как тогда?

Если требуется равномерность распределения именно по множеству $G = \{\mathbf{x}\, |\, x_1 + \dots + x_n = A\}$, то берете любой метод генерирования случайного вектора $\xi = (\xi_1,\dots,\xi_n)$ по известной плотности распределения $f_{\xi}(\mathbf{x})  = I_G(\mathbf{x}) / \mathrm{mes}\, G$, где $I_G$ - индикаторная функция множества $G$. Ну, например, такой:
находите все условные плотности распределения $f_{\xi_i | \xi_1,\dots,x_{i-1}}(\mathbf{x}), \, i=2, n$, и в качестве реализации нужного случайного вектора полагаете вектор $z = (z_1,\dots\,z_n)$:
$z_1$ - реализация случайной величины с плотностью распределения $f_{x_1}(\cdot)$;
$z_2$ - реализация случайной величины с плотностью распределения $f_{x_2|x_1}(\cdot | z_1)$;
....
$z_n$ - реализация случайной величины с плотностью распределения $f_{x_n|x_1,\dots\,x_{n-1}}(\cdot | z_1,\dots, z_{n-1})$.

 Профиль  
                  
 
 Re: генератор случайных чисел
Сообщение10.10.2011, 19:59 


27/10/09
602
_hum_ в сообщении #491399 писал(а):
Если требуется равномерность распределения именно по множеству $G = \{\mathbf{x}\, |\, x_1 + \dots + x_n = A\}$, то берете любой метод генерирования случайного вектора $\xi = (\xi_1,\dots,\xi_n)$ по известной плотности распределения $f_{\xi}(\mathbf{x})  = I_G(\mathbf{x}) / \mathrm{mes}\, G$, где $I_G$ - индикаторная функция множества $G$. Ну, например, такой:
находите все условные плотности распределения $f_{\xi_i | \xi_1,\dots,x_{i-1}}(\mathbf{x}), \, i=2, n$, и в качестве реализации нужного случайного вектора полагаете вектор $z = (z_1,\dots\,z_n)$:
$z_1$ - реализация случайной величины с плотностью распределения $f_{x_1}(\cdot)$;
$z_2$ - реализация случайной величины с плотностью распределения $f_{x_2|x_1}(\cdot | z_1)$;
....
$z_n$ - реализация случайной величины с плотностью распределения $f_{x_n|x_1,\dots\,x_{n-1}}(\cdot | z_1,\dots, z_{n-1})$.

Тогда, правда, не исключена ситуация, что при некотором наборе $z_1,\dots\,z_{k-1}$ плотность распределения $f_{x_k|x_1,\dots\,x_{k-1}}(\cdot | z_1,\dots, z_{k-1})$ окажется нулевой. Например, первые $z_1,\dots\,z_{k-1}$ выбраны вблизи верхних границ, их сумма уже больше $A$, а все числа должны быть неотрицательными.

 Профиль  
                  
 
 Re: генератор случайных чисел
Сообщение10.10.2011, 20:53 


23/12/07
1763
AndreyL в сообщении #491420 писал(а):
_hum_ в сообщении #491399 писал(а):
Тогда, правда, не исключена ситуация, что при некотором наборе $z_1,\dots\,z_{k-1}$ плотность распределения $f_{x_k|x_1,\dots\,x_{k-1}}(\cdot | z_1,\dots, z_{k-1})$ окажется нулевой. Например, первые $z_1,\dots\,z_{k-1}$ выбраны вблизи верхних границ, их сумма уже больше $A$, а все числа должны быть неотрицательными.

Во-первых, плотность вероятности не может быть нулевой по определению. Во-вторых, событие "первые $z_1,\dots\,z_{k-1}$ выбраны вблизи верхних границ, их сумма уже больше $A$" - невозможное, ибо значения $z_1, ..., z_2$ не выбираются произвольно, а являются реализациями зависимых случайных величин.
Ну, а в-третьих, я наверное соврал. В предложенном варианте функция $f_{\xi}$ не будет плотностью (по отношению к объему), так как объем множества $G$ нулевой. Надо вместо нее расcматривать что-то наподобие микроканонического распределения в физике $f_{\xi}(\mathbf{x}) = C \delta(x_1 + \dots + x_n - A )$, где $C$ - нормировочная констанста, $\delta$ - дельта-функция Дирака.


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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group