2016-05-02 8 views
-2

Я хотел бы генерировать 1 миллиард случайных точек из распределения вероятности и оценивать функции, используя эти точки, для вычисления интеграла Монте-Карло. Проблема в том, что я использую MATLAB и мало знаю других языков программирования. MATLAB, конечно, очень медленный, и я обсудил возможность параллелизации интеграции путем вычисления значений для 100 миллионов точек в 10 различных процессах. Это возможный подход? Если да, то каков наилучший способ его реализации?Параллелизация интеграции Монте-Карло

в настоящее время подход заключается в следующем:

Для I: N
Генерировать случайное число из распределения
Вычислить функцию Добавить оценку функции к временной переменной
конца

Divide временную переменную с помощью N и, следовательно, интеграл был аппроксимирован.

Функция оценивается следующим образом:
0, если генерируется точка меньше, чем число B
разность между точкой и В, если генерируется точка больше или равна B.

Использование Вместо этого будет использоваться подход Арпи, в котором будет использоваться парр-петля.

+3

«Matlab, конечно, очень медленный», хорошо это во многом зависит от пользователя;). Во всяком случае, параллелизация, безусловно, возможна, посмотрите ['parfor'] (http://www.mathworks.com/help/distcomp/parfor.html?refresh=true). Кроме того, я бы пересмотрел ваш подход к вычислению интеграла, существует множество методов снижения вычислительной нагрузки, например. важная выборка. Но «лучший» подход зависит от проблем. – Arpi

+0

Это правда, и со мной, как с пользователем, это определенно медленно;) Спасибо за помощь как в парре, так и в пересмотре моего подхода @Arpi! – rickri

+1

Возможно, вы захотите предоставить описание/уравнения/psuedocode/diagram ваших функций. Существует много подходов к анализу алгоритма, поиск правильного зависит от характера алгоритма. например, если ваша функция просто выполняет базовую арифметику, то узким местом является, вероятно, доступ к памяти, а не процессорное время, что означает, что в использовании нескольких ядер/гиперпотоков мало/нет смысла. –

ответ

1

Казалось бы, это much, much simpler, чем было предложено. Решить проблему можно было аналитически, консультировавшись с wikipedia. Но - и я подчеркиваю, что это на самом деле не правильный подход - так это сайт программирования, здесь программа:

b = 0.3; 
N = 1e9; 
batch_size = 1e8; 

total = 0; 
for ii=1:(N/batch_size) 
    total = sum(max(0,rand(batch_size,1)-b)); 
end 
result = total/N; 

Это занимает около 15 секунд для запуска. Возможно, быстрее, если размер партии будет выбран лучше.

Обратите внимание, что «распределение» здесь равномерно на интервале [0, 1), что может быть не так, как хотелось бы, но этот подход может быть расширен для работы с любым типом распределения (многие из которых являются встроенными в Matlab).

+0

Спасибо! Работает как шарм! – rickri

+0

@ rickri - это ужасный способ решить вашу актуальную проблему. По крайней мере, вы можете использовать фиксированный диапазон значений 'x', а не выбирать их случайным образом. и вы действительно должны аналитически интегрироваться - см. [wkipedia] (https://en.wikipedia.org/wiki/Student%27s_t-distribution#Integral_of_Student.27s_probability_density_function_and_p-value). Вы попали на проблему [XY] (http://meta.stackexchange.com/a/66378). –