Matlab / октава или R лучше подходят для симуляции Монте-Карло?

14

Я начал заниматься Монте-Карло в R как хобби, но в конце концов финансовый аналитик посоветовал перейти на Matlab. Я опытный разработчик программного обеспечения. но начинающий Монте-Карло. Я хочу построить статические модели с анализом чувствительности, позже динамические модели. Нужны хорошие библиотеки / алгоритмы, которые меня направляют.

Мне кажется, что R имеет отличные библиотеки, и я подозреваю, что mathlab предпочитают неопытные программисты из-за легкого языка, похожего на паскаль. Язык R основан на схеме, и это трудно для начинающих, но не для меня. Если у Matlab / Octave нет преимуществ в числовой / библиотечной части, я бы остановился на R.

Роланд Кофлер
источник
2
R основан на Схеме, но довольно хорош, притворяясь новичкам, что он скорее основан на C.
2
> Я не буду публиковать это как ответ, потому что есть много людей, более осведомленных в этих вещах, чем я. Тем не менее, я думаю, что в отношении скорости вы должны различать R base и микс хорошего программиста / отличных пакетов. Хороший программист может использовать некоторые инструменты в кранах, такие как многоядерный, GPUtools & magma (скоро, но еще не пригодный для MCMC), Rcpp, ... для создания довольно быстрого кода. Я не думаю, что у Matlab Central есть что-то сравнимое с предложением.
user603 12.10.10
@kwak - я, наверное, тоже должен был опубликовать свой ответ как комментарий. Прости за это.
М. Тиббитс
2
МТ, это безумие - твой ответ великолепен. Во всяком случае, квак тоже должен дать правильный ответ. Позвольте тем более осведомленным людям проголосовать или ответить так, как они считают нужным.
Мэтт Паркер
Заранее извиняюсь за некропоста. Финансовый пакет GNU Octave octave.sourceforge.net/financial теперь поддерживает (по состоянию на 0.5.0) моделирование по методу Монте-Карло. Это значительно быстрее, чем версия MATLAB, поскольку код написан без циклов for. Для сравнительного анализа (по сравнению с MATLAB) и учебного пособия см. Parsiad.ca/post/simulate-sdes-in-gnu-octave-financial-package . Я должен также обнародовать свой уклон, поскольку я являюсь автором этих методов.
Парсиада

Ответы:

17

Я использую оба. Я часто создаю прототипы функций и алгоритмов в Matlab, потому что, как уже говорилось, легче выразить алгоритм в чем-то, что близко к чисто математическому языку.

У R есть отличные библиотеки. Я все еще учусь этому, но я начинаю оставлять Matlab в пыли, потому что, когда вы знаете R, там также довольно легко создавать прототипы функций.

Однако я считаю, что если вы хотите, чтобы алгоритмы эффективно функционировали в производственной среде, лучше всего перейти на скомпилированный язык, такой как C ++. У меня есть опыт работы с C ++ как в Matlab, так и в R (и в этом смысле превосходно), но у меня был лучший опыт с R. Отказ от ответственности: Будучи аспирантом, я не использовал последнюю версию Matlab для своих библиотек, Я работаю почти исключительно в Matlab 7.1 (ему 4 года). Возможно, более новые версии работают лучше, но я могу вспомнить две ситуации, когда DLL-библиотека C ++ в задней части Matlab вызвала появление Windows XP с синим экраном, потому что я неуместно вышел за границы массива - очень трудная проблема для отладка, если ваш компьютер перезагружается каждый раз, когда вы делаете эту ошибку ...

Наконец, сообщество R, похоже, растет гораздо быстрее и с гораздо большей динамикой, чем когда-либо было сообщество Matlab. Кроме того, поскольку это бесплатно, вы также не имеете дела с менеджером лицензий Godforsaken flexlm.

Примечание: почти все мои разработки сейчас связаны с алгоритмами MCMC. Я делаю около 90% в производстве в C ++ с визуализацией в R с использованием ggplot2.

Обновление для параллельных комментариев:

Сейчас я потратил немало времени на параллелизацию процедур MCMC (это моя кандидатская диссертация). Я использовал параллельный инструментарий Matlab и решение Star P (которое, я полагаю, теперь принадлежит Microsoft ?? - еще один сожрал ...) Я обнаружил, что параллельный инструментарий - это кошмар конфигурации - когда я его использовал, это требовало корневого доступа к каждому клиентскому узлу. Я думаю, что они исправили эту маленькую «ошибку» сейчас, но все еще беспорядок. Я нашел решение * 'p элегантным, но часто сложным для профилирования. Я не использовал куртку , но слышал хорошие вещи. Я также не использовал более поздние версии параллельного инструментария, которые также поддерживают вычисления на GPU.

У меня практически нет опыта работы с параллельными пакетами R.

По моему опыту, распараллеливание кода должно происходить на уровне C ++, где у вас есть более тонкая гранулярность контроля для декомпозиции задач и распределения памяти / ресурсов. Я считаю, что если вы пытаетесь распараллелить программы на высоком уровне, вы часто получаете только минимальное ускорение, если ваш код не является тривиально разложимым (также называемым фиктивным параллелизмом). Тем не менее, вы можете даже получить разумное ускорение, используя одну строку на уровне C ++, используя OpenMP:

#pragma omp parallel for

У более сложных схем есть кривая обучения, но мне действительно нравится, куда идут дела в gpgpu. Что касается JSM в этом году, несколько человек, с которыми я говорил о разработке графических процессоров в R, называют это, так сказать, всего лишь «пальцами в глубине». Но, как указано, у меня минимальный опыт - поменять в ближайшее время.

М. Тиббитс
источник
+1 для C ++; хотя встраивать C / C ++ в RI довольно просто, я часто оборачиваю мои коды и запускаю их внутри R - тогда лучше передавать параметры, делать визуализацию в реальном времени и, очевидно, анализировать результаты, не задумываясь о формате выходного файла.
хорошо сказано; MC в конечном итоге потребует перейти на C / C ++. У меня нет достаточного опыта в R, чтобы комментировать, но у меня были некоторые головные боли при использовании C / C ++ с Matlab из-за разных версий библиотек разделяемых объектов (под Linux), загружаемых исполняемым файлом Matlab, чем то, с чем я хочу связать мой код
Шаббычеф
tibbits: Как вы генерируете RN при использовании openMP?
csgillespie
Прямо сейчас я не. Самые дорогие части моих алгоритмов MCMC - это вычисление нескольких вероятностей, поэтому я стараюсь собрать их как можно лучше и вычислить их параллельно. Но все настройки, генерация RN (для предложений), выполняются на одном ядре процессора. Для параллельных RNG я бы начал с DC для Mersenne Twister - но лично я никогда не использовал его, кроме тривиального перевода в CUDA для графических процессоров (больше как упражнение на самом деле).
М. Тиббитс
15

Честно говоря, я думаю, что любой вопрос, который вы зададите здесь о R против ..., будет смещен в сторону R. Помните, что R - безусловно, самый используемый тег !

Что я делаю

Моя текущая практика работы - использовать R для создания прототипа и использовать C, когда мне нужно дополнительное повышение скорости. Раньше мне приходилось очень быстро переключаться на C (опять же для моих конкретных приложений), но многоядерные библиотеки R помогли задержать это переключение. По сути, вы делаете forцикл, запущенный параллельно с тривиальным изменением.

Я должен отметить, что мои приложения очень интенсивны в вычислительном отношении.

Рекомендация

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

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

Я полагаю, что эта проблема идеально подходит для создания прототипов в R и использования C при необходимости (или некоторого другого скомпилированного языка).

Сказав это, как правило, анализ Монте-Карло / чувствительности не включает в себя особенно продвинутые статистические процедуры - конечно, он может нуждаться в других расширенных функциях. Поэтому я думаю (без дополнительной информации), что вы могли бы провести анализ на любом языке, но, будучи полностью предвзятым, я бы порекомендовал R!

csgillespie
источник
4
Мне нравится часть о том, что «моя текущая рабочая практика - использовать R для создания прототипа и использовать C, когда мне нужно дополнительное повышение скорости». - это звучит как описание работы моей бедной недостойной личности и разработчиков C ++ в соседнем офисе ... и я думаю, что это действительно отражает в основном любую ситуацию, касающуюся R, C / C ++ и проблему статистических вычислений.
Стефан Коласса
9

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

По крайней мере, для меня использование Rprofнесравнимо хуже. Я не могу понять, какой звонок является узким местом. При использовании Rprofвы не получаете информацию о том, сколько времени тратится на каждую строку, но сколько времени тратится на каждую примитивную функцию (или около того). Однако множество одинаковых примитивных функций вызывается множеством различных функций.

Хотя я рекомендую R(потому что это просто здорово: бесплатно, очень мощно, ...), если вы знаете, что вам нужно много профилировать свой код, Matlab намного лучше. И, честно говоря, в Matlab есть многоядерные и параллельные вычислительные наборы инструментов (хотя и очень дорогие).

Хенрик
источник
4
Я полностью согласен @Henrik. Если вы беспокоитесь о профилировании, у Matlab есть отличный инструмент для профилирования (даже в версии 7.1 !!). С другой стороны, Rprof оставляет желать лучшего. Я заканчиваю профилирование, выполняя каждую команду несколько раз в цикле for и сравнивая system.timeразницу между разными версиями. Вот интересный пример из практики
М. Тиббитс
2

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

PeterR
источник
2

На мой взгляд, Matlab - уродливый язык. Возможно, он получил аргументы по умолчанию и именованные аргументы в своем ядре к настоящему времени, но многие примеры, которые вы находите в сети, делают старое «Если есть 6 аргументов, это, иначе, если есть 5 аргументов это и то ...» и именованные аргументы просто векторы с чередующимися строками (именами) и значениями. Это так 1970-х годов, что я просто не могу его использовать.

У R могут быть свои проблемы, и он тоже старый, но он был построен на фундаменте (Scheme / Lisp), который был ориентирован на будущее и достаточно хорошо выдерживал сравнение.

Тем не менее, Matlab намного быстрее, если вы любите кодировать с помощью циклов и т. Д. И он имеет гораздо лучшие средства отладки. И еще интерактивная графика. С другой стороны, то, что нужно для документирования вашего кода / библиотек, довольно смешно по сравнению с R, и вы платите немалые деньги за использование Matlab.

Все ИМО.

Wayne
источник