Matlab / octave或R是否更适合蒙特卡洛模拟?


14

我开始在R从事蒙特卡洛的业余爱好,但最终一位财务分析师建议迁移到Matlab。我是一位经验丰富的软件开发人员。但是是蒙特卡洛的初学者。我想用灵敏度分析来构造静态模型,然后再构造动态模型。需要指导我的好的库/算法。

在我看来,R具有出色的库,而且我怀疑mathlab被无经验的程序员所青睐,因为它具有类似于pascal的简单语言。R语言是基于方案的,这对初学者来说很难,但对我而言却不是。如果Matlab / Octave在数值/库方面没有优势,我会坚持使用R。


2
R是基于Scheme的,但是可以很好地伪装成初学者,它是基于C的。

2
>我不会将其发布为答案,因为有很多人比我更了解这些知识。但是,我认为关于速度,您必须区分R base和混合好的程序员/优秀软件包。一个好的程序员可以利用cran中的一些工具,例如多核,GPUtools&magma(不久但对MCMC尚未使用),Rcpp等来编写非常快速的代码。我认为Matlab Central不能提供任何可比的东西。
user603 2010年

@kwak-我可能也应该将我的回答也发表为评论。对于那个很抱歉。
M. Tibbits,2010年

2
MT,这太疯狂了-您的答案很棒。如果有的话,郭某也应该做出正确的回答。让那些知识渊博的投票或回答者认为合适。
马特·帕克

提前为死灵书道歉。GNU Octave金融软件包octave.sourceforge.net/financial现在支持(自0.5.0起)蒙特卡洛模拟。这是显著快于MATLAB版本的代码而不for循环写的。有关基准测试(与MATLAB相比)和教程,请参见parsiad.ca/post/simulate-sdes-in-gnu-octave-financial-package。我也应该公开我的偏见,因为我是这些方法的作者。
parsiad

Answers:


17

我都用。我经常在Matlab中对函数和算法进行原型设计,因为如上所述,用一种接近于纯数学语言的语言来表达算法更容易。

R确实具有出色的库。我仍然在学习它,但是我开始把Matlab抛在脑后,因为一旦您知道R,就可以很容易地在那里编写函数原型。

但是,我发现,如果希望算法在生产环境中有效运行,则最好改用C ++之类的编译语言。我有将C ++包装到Matlab和R中的经验(并且在这方面也很出色),但是我对R有更好的体验。 免责声明:作为一名研究生,我没有将DLL的最新版本用于我的dll,我几乎只在Matlab 7.1中工作(大约4岁)。较新的版本可能工作得更好,但是我想到了两种情况,Matlab后面的C ++ dll导致Windows XP蓝屏,因为我不恰当地走出了数组界限-这是一个非常棘手的问题调试是否在每次出错时重新启动计算机...

最后,R社区似乎比Matlab社区拥有更快,更强大的发展势头。此外,由于它是免费的,所以您也无需与Godforsaken flexlm许可证管理器打交道。

注意:目前,我几乎所有的开发都使用MCMC算法。我使用ggplot2在R ++中以可视化方式在C ++中进行了约90%的生产。

并行注释更新:

我目前有相当一部分开发时间用于并行化MCMC例程(这是我的博士学位论文)。我曾经使用过Matlab的并行工具箱和Star P的解决方案(我猜现在是Microsoft拥有的解决方案-哎呀,另一个吞噬了……)我发现并行工具箱是配置的噩梦 -当我使用它时,它需要对每个客户端节点具有root访问权限。我认为他们已经修复了这个小“ bug”,但仍然一团糟。我发现*'p解决方案很优雅,但通常很难描述。我没有用过Jacket,但是我听说过好东西。我也没有使用过并行工具箱的最新版本,该工具箱也支持GPU计算。

我几乎没有使用R并行软件包的经验。

根据我的经验,并行化代码必须在C ++级别上进行,在C ++级别上,您具有对任务分解和内存/资源分配的更好控制粒度。我发现,如果您尝试以较高的级别并行化程序,则通常只会获得最小的加速,除非您的代码易分解(也称为伪并行)。也就是说,您甚至可以使用OpenMP在C ++级别使用单行代码来获得合理的加速:

#pragma omp parallel for

更复杂的方案具有学习曲线,但是我真的很喜欢gpgpu的发展方向。截至今年的JSM,我在R中谈论过GPU开发的少数​​人都将其称为“深入人心”。但是如上所述,我的经验很少-在不久的将来进行更改。


C ++ +1;尽管将C / C ++嵌入到RI中非常容易,但经常包装我的代码并在R中运行它们-然后,更好地传递参数,进行实时可视化并明显地分析结果而无需考虑输出文件格式。

说得好; MC最终将需要迁移到C / C ++。我没有足够的R语言经验来发表评论,但是由于Matlab可执行文件引入了不同版本的共享对象库(在Linux下),而与Matlab一起使用时,我在使用C / C ++与Matlab时遇到了很多麻烦我的代码。
shabbychef

小知识:使用openMP时如何生成RN?
csgillespie 2010年

现在,我不是。我的MCMC算法中最昂贵的部分正在计算几种可能性,因此我尝试将它们尽可能地组合在一起并并行计算。但是,所有的设置,RN生成(用于建议)都在单个cpu内核上完成。对于并行RNG,我将从Mersenne Twister的DC开始-但是我从来没有亲自使用过它,而只是将其简单地转换为GPU的CUDA(实际上更多是作为练习)。
M. Tibbits,2010年

15

老实说,我想您在这里问到的关于R vs ...的任何问题都会对R产生偏见。请记住,R是迄今为止使用最多的标签

我做的事

我目前的工作习惯是在需要进一步提高速度时使用R进行原型制作并使用C。过去,我不得不非常快地切换到C(同样针对我的特定应用程序),但是R 多核库帮助延迟了切换。本质上,您将for循环与琐碎的更改并行运行。

我应该提到我的应用程序在计算上非常密集。

建议

老实说,这实际上取决于您要做什么。因此,我将根据您问题中的这一陈述回答我。

我想用灵敏度分析来构造静态模型,然后再构造动态模型。需要指导我的好的库/算法

我以为这个问题非常适合在R中进行原型设计,并在需要时(或其他某种编译语言)使用C。

话虽如此,通常蒙特卡洛/灵敏度分析并不涉及特别高级的统计程序-当然,它可能需要其他高级功能。因此,我认为(没有更多信息)您可以使用任何语言进行分析,但是由于存在偏见,我建议您使用R!


4
我喜欢“我目前的工作习惯是在需要进一步提高速度时使用R进行原型制作并使用C”这一部分。-听起来像是我那可怜的不值钱的自我和下一个办公室的C ++开发人员的工作描述...,我认为它实际上捕获了涉及R,C / C ++以及统计计算问题的所有情况。
Stephan Kolassa 2010年

9

尽管我几乎完全使用过R,但我确实很欣赏Matlab
当您的程序运行缓慢时,您通常想知道瓶颈在哪里。Matlab的探查器是实现此目标的绝佳工具,它可以告诉您在代码的每一行上花费了多少时间。

至少对我来说,使用Rprof是无与伦比的。我不知道哪个电话是瓶颈。使用Rprof您不会获得有关在每行上花费多少时间的信息,但是会得到在每个基本函数上花费多少时间(或如此)的信息。但是,许多相同的原始函数被许多不同的函数调用。

尽管我建议R(因为它很棒:免费,功能非常强大……),如果您知道必须对代码进行大量分析,那么Matlab会更好。公平地说,Matlab中有多核和并行计算工具箱(尽管价格昂贵)。


4
我完全同意@Henrik。如果您担心性能分析,Matlab会提供出色的性能分析工具(即使在7.1版中也是如此!)。另一方面,Rprof仍有很多不足之处。我最终通过在for循环中多次执行每个命令并比较system.time不同版本之间的差异来进行概要分析。 这是一个有趣的案例研究
M. Tibbits,2010年

2

如果您的仿真将涉及相对复杂的技术,那么R是可行的方法,因为您可能需要的例程可能会在R中可用,但不一定在matlab中可用。


2

我认为Matlab是一种丑陋的语言。也许到目前为止,它已经成为默认参数和命名参数了,但是您在网上找到的许多示例都执行旧的“如果有6个参数,则此,否则如果有5个参数……”和命名参数只是带有交替字符串(名称)和值的向量。那是1970年代,以至于我根本无法使用它。

R可能有它的问题,并且它也很老,但是它建立在前瞻性的基础上(Scheme / Lisp),并且在比较中保持了很好的状态。

就是说,如果您喜欢使用循环等进行编码,Matlab的速度会更快。它具有更好的调试功能。以及更多的交互式图形。另一方面,与R相比,用于记录代码/库的过程相当可笑,并且您为使用Matlab付出了很多钱。

所有IMO。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.