Là Matlab / octave hoặc R phù hợp hơn cho mô phỏng monte carlo?


14

Tôi bắt đầu làm Monte Carlo ở R như một sở thích, nhưng cuối cùng một nhà phân tích tài chính khuyên nên chuyển sang Matlab. Tôi là một nhà phát triển phần mềm có kinh nghiệm. nhưng một người mới bắt đầu Monte Carlo. Tôi muốn xây dựng các mô hình tĩnh với phân tích độ nhạy, các mô hình động sau này. Cần thư viện / thuật toán tốt hướng dẫn tôi.

Đối với tôi dường như R có các thư viện tuyệt vời và tôi nghi ngờ mathlab được các lập trình viên thiếu kinh nghiệm ưa thích vì ngôn ngữ giống như pascal dễ dàng. Ngôn ngữ R dựa trên sơ đồ và điều này khó cho người mới bắt đầu, nhưng đối với tôi thì không. Nếu Matlab / Octave không có lợi thế về mặt số / thư viện, tôi sẽ gắn bó với R.


2
R dựa trên Scheme nhưng khá tốt trong việc giả vờ với người mới bắt đầu rằng nó khá dựa trên C.

2
> Tôi sẽ không đăng bài này như một câu trả lời vì có nhiều người hiểu biết về những điều này hơn tôi. Tuy nhiên, tôi nghĩ rằng liên quan đến tốc độ bạn phải phân biệt giữa cơ sở R và các gói lập trình tốt / gói lớn. Một lập trình viên giỏi có thể tận dụng một số công cụ trong cran như đa lõi, GPUtools & magma (sớm nhưng chưa hữu ích cho MCMC), Rcpp, ... để tạo mã khá nhanh. Tôi không nghĩ matlab trung tâm có bất cứ điều gì có thể so sánh để cung cấp.
dùng603

@kwak - Có lẽ tôi cũng nên đăng câu trả lời của mình dưới dạng bình luận. Xin lỗi vì điều đó.
M. Tibbits

2
MT, thật điên rồ - câu trả lời của bạn thật tuyệt. Nếu bất cứ điều gì, kwak cũng nên làm cho mình một câu trả lời thích hợp. Hãy để những người hiểu biết hơn bỏ phiếu hoặc trả lời khi họ thấy phù hợp.
Matt Parker

Xin lỗi trước cho việc hoại tử. Gói tài chính GNU Octave octave.sourceforge.net/fin finance hiện hỗ trợ (kể từ 0.5.0) mô phỏng Monte Carlo. Nó nhanh hơn đáng kể so với phiên bản MATLAB vì mã được viết mà không có vòng lặp. Để biết điểm chuẩn (so với MATLAB) và hướng dẫn, hãy xem Parsiad.ca/post/simulation-sdes-in-gnu-octave-fin finance-package . Tôi cũng nên công khai sự thiên vị của mình, vì tôi là tác giả của những phương pháp này.
Parsiad

Câu trả lời:


17

Tôi sử dụng cả hai. Tôi thường sử dụng các hàm và thuật toán nguyên mẫu trong Matlab bởi vì, như đã nêu, việc thể hiện một thuật toán theo thứ gì đó gần với ngôn ngữ toán học thuần túy sẽ dễ dàng hơn.

R có thư viện tuyệt vời. Tôi vẫn đang học nó, nhưng tôi bắt đầu để Matlab trong bụi vì một khi bạn biết R, thì việc tạo nguyên mẫu ở đó cũng khá dễ dàng.

Tuy nhiên, tôi thấy rằng nếu bạn muốn các thuật toán hoạt động hiệu quả trong môi trường sản xuất, tốt nhất nên chuyển sang một ngôn ngữ được biên dịch như C ++. Tôi có kinh nghiệm gói C ++ vào cả Matlab và R (và excel cho vấn đề đó), nhưng tôi đã có trải nghiệm tốt hơn với R. Disclaimer: Là một học sinh tốt nghiệp, tôi đã không sử dụng một phiên bản Matlab gần đây cho các dlls của mình, Tôi đã làm việc gần như độc quyền trong Matlab 7.1 (giống như 4 tuổi). Có lẽ các phiên bản mới hơn hoạt động tốt hơn, nhưng tôi có thể nghĩ đến hai tình huống ngoài đỉnh đầu của tôi, nơi một dll C ++ ở phía sau Matlab khiến Windows XP chuyển sang màn hình xanh vì tôi đi không đúng cách bên ngoài một mảng - một vấn đề rất khó giải quyết gỡ lỗi nếu máy tính của bạn khởi động lại mỗi khi bạn mắc lỗi đó ...

Cuối cùng, cộng đồng R dường như phát triển nhanh hơn nhiều và với động lực lớn hơn nhiều so với cộng đồng Matlab từng có. Hơn nữa, vì nó miễn phí, bạn cũng không phải đối phó với người quản lý giấy phép flexlm Godforsaken.

Lưu ý: Hầu như tất cả sự phát triển của tôi là trong các thuật toán MCMC ngay bây giờ. Tôi thực hiện khoảng 90% sản xuất trong C ++ với trực quan hóa trong R bằng ggplot2.

Cập nhật cho các bình luận song song:

Một lượng khá lớn thời gian phát triển của tôi ngay bây giờ được dành cho việc song song hóa các thói quen MCMC (đó là luận án tiến sĩ của tôi). Tôi đã sử dụng hộp công cụ song song của Matlab và giải pháp của Star P (mà tôi đoán bây giờ thuộc sở hữu của Microsoft ?? - một cái khác bị ngấu nghiến ...) Tôi thấy hộp công cụ song song là một cơn ác mộng cấu hình - khi tôi sử dụng nó, nó yêu cầu quyền truy cập root vào mỗi nút máy khách. Tôi nghĩ rằng họ đã sửa "lỗi" nhỏ đó bây giờ, nhưng vẫn còn một mớ hỗn độn. Tôi tìm thấy giải pháp * 'p là thanh lịch, nhưng thường khó để hồ sơ. Tôi chưa sử dụng Áo khoác , nhưng tôi đã nghe thấy những điều tốt. Tôi cũng chưa sử dụng các phiên bản gần đây hơn của hộp công cụ song song cũng hỗ trợ tính toán GPU.

Tôi hầu như không có kinh nghiệm với các gói song song R.

Theo kinh nghiệm của tôi, mã song song phải xảy ra ở cấp độ C ++, nơi bạn có mức độ kiểm soát chi tiết hơn để phân tách tác vụ và phân bổ bộ nhớ / tài nguyên. Tôi thấy rằng nếu bạn cố gắng song song hóa các chương trình ở mức cao, bạn thường chỉ nhận được một tốc độ tối thiểu trừ khi mã của bạn có thể phân tách một cách tầm thường (còn được gọi là song song giả). Điều đó nói rằng, bạn thậm chí có thể nhận được các bản tăng tốc hợp lý bằng cách sử dụng một dòng ở cấp độ C ++ bằng OpenMP:

#pragma omp parallel for

Đề án phức tạp hơn có một đường cong học tập, nhưng tôi thực sự thích nơi mọi thứ gpgpu đang diễn ra. Kể từ JSM năm nay, rất ít người mà tôi đã nói về việc phát triển GPU trong R trích dẫn nó chỉ là "những ngón chân ở tận cùng" để nói. Nhưng như đã nêu, tôi có kinh nghiệm tối thiểu - để thay đổi trong tương lai gần.


+1 cho C ++; mặc dù khá dễ dàng để nhúng C / C ++ vào RI thường bọc mã của tôi và chạy chúng bên trong R - sau đó sẽ tốt hơn để truyền tham số, thực hiện trực quan và phân tích rõ ràng kết quả mà không nghĩ đến định dạng tệp đầu ra.

cũng đặt; MC cuối cùng sẽ yêu cầu một người chuyển sang C / C ++. Tôi không có đủ kinh nghiệm về R để nhận xét, nhưng đã có một số vấn đề đau đầu khi sử dụng C / C ++ với Matlab do các phiên bản khác nhau của các thư viện đối tượng chia sẻ (trong Linux) bị Matlab thực thi so với những gì tôi muốn liên kết mã của tôi.
shabbychef

tibbits: Làm thế nào để bạn tạo RN khi sử dụng openMP?
csgillespie

Ngay bây giờ, tôi không. Các phần đắt nhất trong thuật toán MCMC của tôi là tính toán một số khả năng vì vậy tôi cố gắng kết hợp chúng lại với nhau tốt nhất có thể và tính toán chúng song song. Nhưng tất cả các thiết lập, tạo RN (cho các đề xuất), được thực hiện trên một lõi cpu. Đối với các RNG song song, tôi bắt đầu với DC cho Mersenne Twister - nhưng cá nhân tôi chưa bao giờ sử dụng nó ngoài bản dịch tầm thường sang CUDA cho GPU (thực sự giống như một bài tập).
M. Tibbits

15

Thành thật mà nói, tôi nghĩ rằng bất kỳ câu hỏi nào bạn hỏi quanh đây về R vs ... sẽ thiên về R. Hãy nhớ rằng R là thẻ được sử dụng nhiều nhất !

Những gì tôi làm

Thực hành làm việc hiện tại của tôi là sử dụng R để tạo nguyên mẫu và sử dụng C khi tôi cần tăng thêm tốc độ. Trước đây tôi thường phải chuyển sang C rất nhanh (một lần nữa cho các ứng dụng cụ thể của tôi), nhưng các thư viện đa lõi R đã giúp trì hoãn việc chuyển đổi đó. Về cơ bản, bạn thực hiện một forvòng lặp chạy song song với một thay đổi nhỏ.

Tôi nên đề cập rằng các ứng dụng của tôi rất chuyên sâu tính toán.

sự giới thiệu

Thành thật mà nói, nó thực sự phụ thuộc vào chính xác những gì bạn muốn làm. Vì vậy, tôi dựa trên câu trả lời của tôi về câu hỏi này trong câu hỏi của bạn.

Tôi muốn xây dựng các mô hình tĩnh với phân tích độ nhạy, các mô hình động sau này. Cần thư viện / thuật toán tốt hướng dẫn tôi

Tôi tưởng tượng rằng vấn đề này sẽ phù hợp lý tưởng với việc tạo nguyên mẫu trong R và sử dụng C khi cần (hoặc một số ngôn ngữ được biên dịch khác).

Nói rằng, điển hình là phân tích độ nhạy / Monte-Carlo không liên quan đến các thói quen thống kê đặc biệt tiên tiến - tất nhiên nó có thể cần chức năng nâng cao khác. Vì vậy, tôi nghĩ (không có thêm thông tin) rằng bạn có thể thực hiện phân tích của mình bằng bất kỳ ngôn ngữ nào, nhưng hoàn toàn sai lệch, tôi sẽ đề xuất R!


4
Tôi thích phần "Thực hành làm việc hiện tại của tôi là sử dụng R để tạo nguyên mẫu và sử dụng C khi tôi cần tăng thêm tốc độ." - nghe có vẻ như mô tả công việc về bản thân không xứng đáng của tôi và các nhà phát triển C ++ ở văn phòng tiếp theo ... và tôi nghĩ rằng nó thực sự nắm bắt bất kỳ tình huống nào liên quan đến R, C / C ++ và một vấn đề trong tính toán thống kê.
S. Kolassa - Tái lập Monica

9

Mặc dù tôi hầu như chỉ sử dụng R, tôi thực sự ngưỡng mộ trình hồ sơ Matlab.
Khi chương trình của bạn chậm, bạn thường muốn biết nút cổ chai ở đâu. Trình hồ sơ của Matlab là một công cụ tuyệt vời để đạt được điều này vì nó cho bạn biết bao nhiêu thời gian dành cho mỗi dòng mã.

Ít nhất với tôi, sử dụng Rproflà tồi tệ hơn nhiều. Tôi không thể tìm ra cuộc gọi nào là nút cổ chai. Sử dụng Rprofbạn không nhận được thông tin về thời gian dành cho mỗi dòng, nhưng dành bao nhiêu thời gian cho mỗi chức năng nguyên thủy (hoặc hơn thế). Tuy nhiên, rất nhiều chức năng nguyên thủy giống nhau được gọi bởi rất nhiều chức năng khác nhau.

Mặc dù tôi khuyên bạn R(vì nó chỉ tuyệt vời: miễn phí, cực kỳ mạnh mẽ, ...) nếu bạn biết rằng bạn phải hồ sơ mã của mình rất nhiều, Matlab là cách tốt hơn. Và công bằng mà nói, có các hộp công cụ tính toán đa lõi và song song trong Matlab (mặc dù, cực kỳ đắt tiền).


4
Tôi hoàn toàn đồng ý @Henrik. Nếu bạn quan tâm đến việc định hình, Matlab có một công cụ định hình tuyệt vời (thậm chí trở lại trong phiên bản 7.1 !!). Rprof mặt khác để lại rất nhiều mong muốn. Tôi kết thúc hồ sơ bằng cách thực hiện mỗi lệnh nhiều lần trong một vòng lặp for và so sánh sự system.timekhác biệt giữa các phiên bản khác nhau. Đây là một nghiên cứu trường hợp thú vị
M. Tibbits

2

Nếu các mô phỏng của bạn sẽ liên quan đến các kỹ thuật tương đối phức tạp, thì R là hướng đi, bởi vì có khả năng các thói quen bạn cần sẽ có sẵn trong R, nhưng không nhất thiết phải là trong MATLAB.


2

Theo tôi, Matlab là một ngôn ngữ xấu xí. Có lẽ bây giờ nó đã nhận được các đối số mặc định và các đối số được đặt tên trong lõi của nó, nhưng nhiều ví dụ bạn tìm thấy trực tuyến thực hiện theo cách cũ "Nếu có 6 đối số, điều này, nếu có 5 đối số này và ..." và các đối số được đặt tên chỉ là vectơ với các chuỗi (tên) và giá trị xen kẽ. Đó là những năm 1970 mà tôi đơn giản là không thể sử dụng nó.

R có thể có các vấn đề của nó, và nó cũng đã cũ, nhưng nó được xây dựng trên nền tảng (Scheme / Lisp) có tính hướng về phía trước và được so sánh khá tốt.

Điều đó nói rằng, Matlab nhanh hơn nhiều nếu bạn muốn viết mã bằng các vòng lặp, v.v. Và nó có các phương tiện sửa lỗi tốt hơn nhiều. Và nhiều đồ họa tương tác hơn. Mặt khác, những gì vượt qua để ghi lại mã / thư viện của bạn là khá buồn cười so với R và bạn phải trả một xu khá lớn để sử dụng Matlab.

Tất cả IMO.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.