2013-04-26 30 views
6

Tôi cần phải giải quyết (nhiều lần, đối với nhiều dữ liệu, cùng với một loạt các thứ khác) những gì tôi nghĩ tóm tắt thành một số second order cone program. Nó có thể được cô đọng thể hiện trong CVX một cái gì đó như thế này:Tối ưu hóa lồi CVX-esque trong R?

cvx_begin 
    variable X(2000); 
    expression MX(2000); 
    MX = M * X; 
    minimize(norm(A * X - b) + gamma * norm(MX, 1)) 
    subject to 
    X >= 0 
    MX((1:500) * 4 - 3) == MX((1:500) * 4 - 2) 
    MX((1:500) * 4 - 1) == MX((1:500) * 4) 
cvx_end 

Dữ liệu độ dài và các mẫu chế bình đẳng thể hiện chỉ là giá trị tùy ý từ một số dữ liệu kiểm tra, nhưng dưới hình thức nói chung sẽ được nhiều giống nhau, với hai nhiệm kỳ mục tiêu - - một lỗi giảm thiểu, sự khan hiếm khuyến khích khác - và một số lượng lớn các ràng buộc bình đẳng trên các phần tử của một phiên bản biến đổi của biến tối ưu hóa (bản thân nó bị ràng buộc là không âm).

Điều này dường như hoạt động khá độc đáo, tốt hơn nhiều so với cách tiếp cận trước đó của tôi, điều này làm nảy sinh những hạn chế một cái gì đó thối. Vấn đề là mọi thứ khác xung quanh điều này đang xảy ra trong R, và nó sẽ là một mối phiền toái khi phải chuyển nó sang Matlab. Vì vậy, làm điều này trong R khả thi, và nếu như vậy làm thế nào?

Điều này thực sự có hai câu hỏi riêng biệt:

1) Có tài nguyên R tốt cho điều này không? Theo như tôi có thể biết từ CRAN task page, các tùy chọn gói SOCP là CLSCOPDWD, bao gồm trình giải mã SOCP làm phụ trợ cho trình phân loại của nó. Cả hai đều có giao diện tương tự nhưng khá mờ đục và hơi mỏng về tài liệu và ví dụ, đưa chúng ta đến:

2) Cách tốt nhất để biểu diễn vấn đề ở trên trong định dạng khối ràng buộc được sử dụng bởi các gói này là gì? Cú pháp CVX ở trên che giấu rất nhiều tẻ nhạt với các biến phụ và như vậy, và tôi chỉ có thể thấy mình chi tiêu tuần cố gắng để có được quyền này, vì vậy bất kỳ lời khuyên hoặc gợi ý để di chuyển tôi đi đúng hướng sẽ rất hoan nghênh. ..

+1

Cải biến vấn đề (giới thiệu các biến slack để loại bỏ định mức L^1 và biến L^2 thành giới hạn hình nón) tương đối dễ dàng: thay thế L^1 định mức 'M% *% x' với 'yz' và thêm các ràng buộc' y> = 0', 'z> = 0'; thay thế L^2 tiêu chuẩn của 'A% *% x - b' bằng' t' và thêm các ràng buộc 't> = sqrt (t (u)% *% u)', 'u = A % *% x - b'. Hầu hết các biến đổi đó thậm chí có thể là [tự động] (http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html), như với CVX, nhưng đối với một vấn đề đơn giản như vậy, nó có lẽ không đáng để gặp rắc rối. –

+1

Tuy nhiên, định dạng đầu vào của 'DWD :: sqlp' hoặc' CLSOCP :: socp' không có giấy tờ: bạn được cho biết đối số nào chứa các ràng buộc, nhưng không phải cách chúng được mã hóa ... Bạn có thể thử liên hệ với tác giả của các gói đó, để có thêm thông tin về việc mã hóa các ràng buộc. Bạn cũng có thể xem gói 'Rcsdp': để giải quyết vấn đề (chương trình bán xác định), đầu vào được ghi thành tài liệu, nhưng chuyển vấn đề của bạn thành biểu mẫu mong muốn sẽ không đơn giản ... –

+0

@Vincent Cảm ơn, điều đó rất hữu ích. (Và đó là một bài đăng trên blog!) 'DWD :: sqlp' trông giống như được mô hình hoá trên SDPT3, vì vậy có thể làm rõ các đầu vào bằng cách so sánh. – walkytalky

Trả lời

2

Bạn có thể tìm thấy gói R CVXfromR hữu ích. Điều này cho phép bạn chuyển vấn đề tối ưu hóa cho CVX từ R và trả về giải pháp cho R.

1

OK, vì vậy câu trả lời ngắn cho câu hỏi này là: thực sự không có cách nào thỏa đáng để xử lý điều này trong R. Tôi đã kết thúc các phần liên quan trong Matlab với một số fudging vụng về giữa hai hệ thống, và có lẽ sẽ di chuyển tất cả mọi thứ để Matlab cuối cùng. Trong phương pháp hiện tại của tôi trước câu trả lời được đăng bởi user2439686. Trong thực tế, vấn đề của tôi sẽ khó xử khi sử dụng CVXfromR, nhưng nó trông giống như một gói hữu ích nói chung, vì vậy tôi sẽ chấp nhận câu trả lời đó.)

cho điều này là khá mỏng trên mặt đất, nhưng blog post by Vincent Zoonekynd mà ông đã đề cập trong các ý kiến ​​chắc chắn là giá trị đọc.

Bộ giải mã SOCP chứa trong gói R DWD được chuyển từ bộ giải mã Matlab SDPT3 (trừ các phần SDP), do đó giao diện có lập trình về cơ bản giống nhau. Tuy nhiên, ít nhất trong các bài kiểm tra của tôi, nó chạy chậm hơn rất nhiều và khá nhiều rơi trên các vấn đề với một vài nghìn vars + khó khăn, trong khi SDPT3 giải quyết chúng trong một vài giây. (Tôi đã không thực hiện một so sánh hoàn toàn công bằng về điều này, bởi vì CVX thực hiện một số biến đổi tiện lợi về vấn đề để làm cho nó hiệu quả hơn, trong khi trong R tôi đang sử dụng một định nghĩa khá ngây thơ, nhưng vẫn còn.)

thay thế, đặc biệt nếu bạn đủ điều kiện cho một giấy phép học tập, là sử dụng bộ giải mã thương mại Mosek, trong đó có gói giao diện R Rmosek. Tôi chưa thử điều này, nhưng có thể cho nó một lúc nào đó.

(Ngoài ra, bộ giải khác đi kèm với CVX, SeDuMi, không hoàn toàn trên cùng một vấn đề; các tác giả CVX không đùa khi họ đề xuất dùng thử nhiều bộ giải. Ngoài ra, trong một số lượng lớn các trường hợp, SDTP3 có để chuyển đổi từ Cholesky sang LU phân hủy, điều này làm cho các đơn đặt hàng xử lý có cường độ chậm hơn, chỉ với mục tiêu cải thiện rất nhỏ so với các bước trước LU. Tôi đã tìm thấy nó có giá trị giảm độ chính xác được yêu cầu để tránh điều này, nhưng YMMV.)

1

Có giải pháp thay thế mới: CVXR, xuất phát từ cùng một người. Có một số website, một số papergithub project.

Lập trình Convex có kỷ luật dường như đang phát triển phổ biến theo dõi cvxpy (Python) và Convex.jl (Julia), một lần nữa, được hỗ trợ bởi cùng một người.