Czy Matlab / oktawa lub R lepiej nadaje się do symulacji Monte Carlo?

14

Zacząłem robić Monte Carlo w R jako hobby, ale w końcu analityk finansowy doradził migrację do Matlaba. Jestem doświadczonym programistą. ale początkujący Monte Carlo. Chcę budować modele statyczne z analizą wrażliwości, później modele dynamiczne. Potrzebujesz dobrych bibliotek / algorytmów, które mnie poprowadzą.

Wydaje mi się, że R ma doskonałe biblioteki i podejrzewam, że matematyka jest preferowana przez niedoświadczonych programistów ze względu na łatwy język podobny do pascal. Język R jest oparty na schemacie i jest to trudne dla początkujących, ale nie dla mnie. Jeśli Matlab / Octave nie ma zalet po stronie numerycznej / bibliotecznej, trzymałbym się R.

Roland Kofler
źródło
2
R opiera się na schemacie, ale całkiem dobrze udaje początkującym, że opiera się raczej na C.
2
> Nie opublikuję tego jako odpowiedzi, ponieważ jest wiele osób posiadających większą wiedzę w tych sprawach niż ja. Myślę jednak, że jeśli chodzi o szybkość, musisz odróżnić bazę R od miksu dobrego programatora / świetnych pakietów. Dobry programista może wykorzystać niektóre narzędzia w Cran, takie jak multicore, GPUtools i magma (wkrótce, ale jeszcze nieużyteczne dla MCMC), Rcpp, ... aby stworzyć dość szybki kod. Nie sądzę, że Matlab Central ma coś porównywalnego do oferty.
user603,
@kwak - prawdopodobnie powinienem również opublikować swoją odpowiedź jako komentarz. Przepraszam za to.
M. Tibbits,
2
MT, to szalone - twoja odpowiedź jest świetna. Jeśli już, kwak powinien również udzielić właściwej odpowiedzi. Pozwól tym bardziej kompetentnym głosować lub odpowiadać według własnego uznania.
Matt Parker,
Z góry przepraszamy za nekropolię. Pakiet finansowy GNU Octave octave.sourceforge.net/financial obsługuje teraz (od wersji 0.5.0) symulację Monte Carlo. Jest znacznie szybszy niż wersja MATLAB, ponieważ kod jest zapisywany bez pętli. Benchmarking (w porównaniu z MATLAB) i samouczek można znaleźć na stronie parsiad.ca/post/simulate-sdes-in-gnu-octave-financial-package . Powinienem również opublikować swoje uprzedzenia, ponieważ jestem autorem tych metod.
parsiad

Odpowiedzi:

17

Używam obu. Często prototypuję funkcje i algorytmy w Matlabie, ponieważ, jak powiedziano, łatwiej jest wyrazić algorytm w czymś zbliżonym do czystego języka matematycznego.

R ma doskonałe biblioteki. Wciąż się tego uczę, ale zaczynam zostawiać Matlaba w pyle, ponieważ kiedy poznasz R, łatwo jest też prototypować funkcje.

Uważam jednak, że jeśli chcesz, aby algorytmy działały wydajnie w środowisku produkcyjnym, najlepiej jest przejść do skompilowanego języka, takiego jak C ++. Mam doświadczenie w pakowaniu C ++ zarówno w Matlaba, jak i R (i do tego świetnie), ale mam lepsze doświadczenia z R. Zastrzeżenie: Będąc studentem grad, nie używałem najnowszej wersji Matlaba dla moich bibliotek dll, Pracuję prawie wyłącznie w Matlab 7.1 (który ma 4 lata). Być może nowsze wersje działają lepiej, ale mogę sobie wyobrazić dwie sytuacje, w których dll C ++ z tyłu Matlaba spowodował niebieski ekran systemu Windows XP, ponieważ niewłaściwie wyszedłem poza granice tablicy - bardzo trudny problem debuguj, jeśli komputer uruchamia się ponownie za każdym razem, gdy popełnisz ten błąd ...

Wreszcie, społeczność R wydaje się rosnąć znacznie szybciej i z większym rozmachem niż społeczność Matlaba. Ponadto, ponieważ jest to bezpłatne, nie masz również do czynienia z menedżerem licencji Godforsaken flexlm.

Uwaga: prawie cały mój rozwój dotyczy obecnie algorytmów MCMC. Robię około 90% produkcji w C ++ z wizualizacją w R przy użyciu ggplot2.

Aktualizacja równoległych komentarzy:

Spora część mojego obecnego czasu poświęcana jest na równoległe wykonywanie procedur MCMC (to moja praca doktorska). Użyłem równoległego zestawu narzędzi Matlaba i rozwiązania Star P (które, jak sądzę, jest teraz własnością Microsoftu? - jeez inny jest pożerany ...) Odkryłem, że równoległy zestaw narzędzi jest koszmarem konfiguracji - kiedy go użyłem, wymagało to dostępu do konta root do każdego węzła klienta. Myślę, że naprawili teraz ten mały „błąd”, ale wciąż jest bałagan. Uważam, że rozwiązanie * p jest eleganckie, ale często trudne do profilowania. Nie używałem kurtki , ale słyszałem dobre rzeczy. Nie korzystałem również z nowszych wersji równoległego zestawu narzędzi, które również obsługują obliczenia na GPU.

Nie mam praktycznie żadnego doświadczenia z równoległymi pakietami R.

Z mojego doświadczenia wynika, że ​​kod równoległy musi występować na poziomie C ++, gdzie masz dokładniejszą kontrolę nad rozkładem zadań i alokacją pamięci / zasobów. Uważam, że jeśli próbujesz zrównoleglać programy na wysokim poziomie, często otrzymujesz tylko minimalne przyspieszenie, chyba że twój kod jest w sposób trywialny rozkładalny (zwany również atrapą równoległości). To powiedziawszy, możesz nawet uzyskać rozsądne przyspieszenia przy użyciu pojedynczej linii na poziomie C ++ przy użyciu OpenMP:

#pragma omp parallel for

Bardziej skomplikowane schematy mają krzywą uczenia się, ale naprawdę podoba mi się, dokąd zmierzają gpgpu. Począwszy od JSM w tym roku, kilka osób, z którymi rozmawiałem o rozwoju GPU w R, cytuje to jako „tylko palce u stóp w głębokim końcu”. Ale jak powiedziano, mam minimalne doświadczenie - do zmiany w najbliższej przyszłości.

M. Tibbits
źródło
+1 dla C ++; podczas gdy bardzo łatwo jest osadzić C / C ++ w RI, często zawijam moje kody i uruchamiam je w R - wtedy ładniej jest przekazywać parametry, wykonywać wizualizację na żywo i oczywiście analizować wyniki bez myślenia o formacie pliku wyjściowego.
dobrze wyłożone; MC w końcu będzie wymagać przejścia na C / C ++. Nie mam wystarczającego doświadczenia w R, aby komentować, ale miałem wiele problemów z użyciem C / C ++ z Matlab z powodu różnych wersji bibliotek obiektów współużytkowanych (pod Linuksem) pobieranych przez plik wykonywalny Matlab niż z tym, co chcę połączyć mój kod.
shabbychef
tibbits: Jak generować RN przy użyciu openMP?
csgillespie
W tej chwili nie jestem. Najdroższe części moich algorytmów MCMC obliczają kilka prawdopodobieństw, więc staram się je jak najlepiej zebrać i obliczyć równolegle. Ale wszystkie ustawienia, generowanie RN (dla propozycji), są wykonywane na jednym rdzeniu procesora. W przypadku równoległych RNG zacznę od DC dla Mersenne Twister - ale nigdy osobiście nie użyłem tego poza trywialnym tłumaczeniem na CUDA dla GPU (tak naprawdę to ćwiczenie).
M. Tibbits,
15

Szczerze mówiąc, myślę, że każde pytanie, które zadajesz tutaj na temat R vs ... będzie stronnicze w stosunku do R. Pamiętaj, że R jest zdecydowanie najczęściej używanym znacznikiem !

Co robię

Moja obecna praktyka polega na używaniu R do prototypowania i używaniu C, gdy potrzebuję dodatkowego przyspieszenia. Kiedyś musiałem bardzo szybko przełączać się na C (ponownie dla moich konkretnych aplikacji), ale biblioteki wielordzeniowe R pomogły opóźnić tę zmianę. Zasadniczo wykonujesz forpętlę równolegle z trywialną zmianą.

Powinienem wspomnieć, że moje aplikacje wymagają dużej mocy obliczeniowej.

Rekomendacje

Szczerze mówiąc, tak naprawdę zależy to dokładnie od tego, co chcesz zrobić. Opieram więc swoją odpowiedź na tym stwierdzeniu w twoim pytaniu.

Chcę budować modele statyczne z analizą wrażliwości, później modele dynamiczne. Potrzebujesz dobrych bibliotek / algorytmów, które mnie poprowadzą

Wyobrażam sobie, że ten problem idealnie nadaje się do prototypowania w języku R i używania C w razie potrzeby (lub innego skompilowanego języka).

Mówiąc, że typowo analiza Monte-Carlo / analiza wrażliwości nie obejmuje szczególnie zaawansowanych procedur statystycznych - oczywiście może wymagać innych zaawansowanych funkcji. Więc myślę, że (bez więcej informacji), które mogłyby wykonywać swoją analizę w dowolnym języku, ale jest całkowicie stronniczy, polecam R!

csgillespie
źródło
4
Podoba mi się część o „Moja obecna praktyka pracy polega na użyciu R do prototypowania i używaniu C, gdy potrzebuję dodatkowego przyspieszenia”. - brzmi to jak opis mojej biednej, niegodnej siebie i programistów C ++ w następnym biurze ... i myślę, że naprawdę ujmuje w zasadzie każdą sytuację dotyczącą R, C / C ++ i problem w obliczeniach statystycznych.
Stephan Kolassa
9

Chociaż prawie wyłącznie używam R, naprawdę podziwiam profiler w Matlab.
Kiedy twój program działa powoli, zwykle chcesz wiedzieć, gdzie jest wąskie gardło. Profiler Matlaba jest doskonałym narzędziem do osiągnięcia tego celu, ponieważ informuje, ile czasu spędza na każdej linii kodu.

Przynajmniej dla mnie używanie Rprofjest nieporównywalnie gorsze. Nie wiem, który telefon jest wąskim gardłem. Za pomocą Rprofnie otrzymujesz informacji o tym, ile czasu spędza się na każdej linii, ale ile czasu spędza na każdej prymitywnej funkcji (lub mniej więcej). Jednak wiele takich samych prymitywnych funkcji jest wywoływanych przez wiele różnych funkcji.

Chociaż polecam R(ponieważ jest po prostu świetny: darmowy, niezwykle wydajny, ...) jeśli wiesz, że musisz dużo profilować swój kod, Matlab jest znacznie lepszy. I szczerze mówiąc, w Matlabie znajdują się wielordzeniowe i równoległe zestawy narzędzi obliczeniowych (choć bardzo drogie).

Henrik
źródło
4
Całkowicie się zgadzam @Henrik. Jeśli martwisz się profilowaniem, Matlab ma doskonałe narzędzie do profilowania (nawet w wersji 7.1 !!). Z drugiej strony Rprof pozostawia wiele do życzenia. Skończyłem profilowanie, wykonując każde polecenie kilka razy w pętli for i porównując system.timeróżnicę między różnymi wersjami. Oto interesujące studium przypadku
M. Tibbits,
2

Jeśli twoje symulacje będą wymagały stosunkowo wyrafinowanych technik, to R jest właściwą drogą, ponieważ prawdopodobne jest, że procedury będą potrzebne w R, ale niekoniecznie w Matlabie.

PeterR
źródło
2

Moim zdaniem Matlab jest brzydkim językiem. Być może otrzymało już domyślne argumenty i nazwane argumenty w swoim rdzeniu, ale wiele przykładów, które można znaleźć w Internecie, robi stare „Jeśli jest 6 argumentów, to, w przeciwnym razie, jeśli jest 5 argumentów to i tamto ...” i nazwane argumenty są po prostu wektory z naprzemiennymi łańcuchami (nazwami) i wartościami. To takie lata siedemdziesiąte, że po prostu nie mogę tego użyć.

R może mieć swoje problemy i jest również stary, ale został zbudowany na fundamencie (Scheme / Lisp), który był wybiegający w przyszłość i radził sobie dość dobrze w porównaniu.

To powiedziawszy, Matlab jest znacznie szybszy, jeśli lubisz kodować za pomocą pętli itp. I ma znacznie lepsze funkcje debugowania. I więcej interaktywnej grafiki. Z drugiej strony, to, co udaje się w celu udokumentowania twojego kodu / bibliotek, jest raczej śmieszne w porównaniu do R, a za korzystanie z Matlaba płacisz całkiem grosza.

Wszystkie IMO.

Wayne
źródło