2014 dxdy logo

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

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




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

 
 
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 16:08 
Это:
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 
Распределение хоть у одной компоненты вектора будет отличным от равномерного. Так что можно сделать что-то вроде
Код:
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 
Аватара пользователя
У меня было какое-то смутное чувство противоречия, но потом я его потерял. Вот две (пусть так) компоненты. Первая распределена равномерно на [1,2]. Вторая равна 3 минус первая. И что?

 
 
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 16:15 
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 
Аватара пользователя
А кто сказал, что компоненты должны быть независимы? Может быть, с зависимыми можно это сделать, а? Надо хотя бы случай трех рассмотреть. Можно ли так подобрать совместное распределение двух с.в. $x$ и $y$ так, чтобы каждая из них была бы равномерно распределена на своем интервале, а также и сумма $x+y$ чтобы тоже оказалась равномерно распределенной.

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

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

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

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

 
 
 
 Re: генератор сл.чисел
Сообщение10.10.2011, 16:46 
AndreyL в сообщении #491342 писал(а):
Тогда y[n] может выйти за пределы своего допустимого диапазона.

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

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

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


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

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

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


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

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


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

 
 
 
 Re: генератор случайных чисел
Сообщение10.10.2011, 17:18 
AndreyL в сообщении #491362 писал(а):
Пока как самый простой и самый долгий вариант.

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

 
 
 
 Re: генератор случайных чисел
Сообщение10.10.2011, 17:19 
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 
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 
_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 
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