2013-04-26 1 views
6

나는 (많은 시간 동안, 다른 많은 것들과 함께 많은 양의 데이터를 위해) 나는 second order cone program으로 내려 간다. 그것은 간결이 같은 CVX 뭔가 표현 될 수있다 :R에서 CVX-esque 볼록 최적화?

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 

데이터 표시 길이와 평등 제약 패턴 테스트 데이터에서 불과 임의의 값이 있지만 일반적인 형태는 두 개의 목표 조건을 훨씬 동일합니다 - 하나는 최소화하는 오차, 다른 하나는 희박한 희박성 (sparsity), 그리고 변형 된 버전의 최적화 변수의 요소들에 대한 많은 양의 동일성 제약 조건들 (그 자체는 음수가 아닌 제약을 가짐)이다.

이것은 이전의 방식보다 훨씬 훌륭하게 잘 작동하는 것 같습니다. 문제는이 문제를 둘러싼 모든 것이 R에서 일어나고 있으며 Matlab으로 이식해야한다는 것은 상당히 불편할 것입니다. 실용적인면에서 이것을하고 있습니까? 그렇다면 어떻게?

이 정말로 두 개의 질문에 종기 :

1) 이것에 대한 좋은 R 자원이 있습니까? 마찬가지로 CRAN task page에서 알 수 있듯이 SOCP 패키지 옵션은 CLSCOPDWD이며 분류 자의 부속 장치로 SOCP 솔버가 포함되어 있습니다. 둘 다 비슷하지만 상당히 불투명 한 인터페이스를 가지고 있으며 문서 및 예제에 약간 희박하여 다음을 제공합니다.

2) 이러한 패키지에서 사용하는 제약 조건 블록 형식에서 위의 문제를 나타내는 가장 좋은 방법은 무엇입니까? 위의 CVX 구문은 여분의 변수 등으로 많은 지루한 것들을 숨기고 있으며, 이 권리를 얻으려는 것을 알 수 있습니다. 따라서 올바른 방향으로 나를 미십시오. ..

+1

을 수정하여 L^1 표준을 제거하고 L^2 표준을 원뿔 제약으로 변환하십시오. 은 상대적으로 쉽습니다. 'M % * % x'의 L^1 표준을 대체하십시오. 'yz' 을 사용하고'y> = 0','z> = 0' 제약 조건을 추가하십시오; 'A % * % x - b'의 L^2 규범을't' 으로 대체하고 제약 조건을 't> = sqrt (t (u) % * % u)', 'u = A % * % x - b'. 대부분의 변환은 [자동] (http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html), 과 마찬가지로 CVX, 과 같은 간단한 문제가있을 수 있지만, 그것은 아마도 문제의 가치가 없습니다. –

+1

그러나 'DWD :: sqlp' 또는'CLSOCP :: socp'의 입력 형식 은 문서화되어 있지 않습니다 : 어떤 인수에 제약 조건이 포함되어 있지만 인코딩 방법은 알려지지 않았습니다. 해당 패키지 작성자 에 제약 조건 인코딩에 대한 자세한 정보가 있습니다. 또한'Rcsdp' 패키지를보실 수 있습니다 : 더 큰 클래스의 문제 (준결승 프로그램)를 주소로, 입력이 문서화되어 있고, 원하는 형태로 문제를 변환하는 것이 쉽지는 않을 것입니다 ... –

+0

@ Vincent 감사합니다. 도움이됩니다. (그리고 그것은 꽤 블로그 게시물입니다!)'DWD :: sqlp'는 SDPT3에서 모델링 된 것처럼 보이므로 비교를 통해 입력을 명확히 할 수 있습니다. – walkytalky

답변

2

R 패키지 CVXfromR이 유용 할 수 있습니다. 이것은 당신이 R에서 CVX에 최적화 문제를 전달하고 솔루션을 R에 반환 할 수있게 해줍니다.

1

좋아요, 그래서이 질문에 대한 짧은 대답은 다음과 같습니다. R에서 이것을 처리하는 방법은 정말 만족스럽지 않습니다. Matlab의 관련 부분을 두 시스템 사이에 어색하게 퍼지게하고 결국 모든 것을 Matlab으로 마이그레이션 할 것입니다. (현재의 접근 방식은 user2439686이 게시 한 답변보다 먼저 나온다. 실제로 CVXfromR을 사용하면 내 문제는 똑같이 어색 할 것이지만 일반적으로 유용한 패키지처럼 보이므로 그 대답을 받아 들일 것이다.)

R 리소스 이것은 땅에 꽤 얇기 때문에, 그가 언급 한 blog post by Vincent Zoonekynd은 확실히 읽을 가치가 있습니다.

R 패키지 DWD에 포함 된 SOCP 솔버는 Matlab 솔버 SDPT3 (SDP 부품 제외)에서 이식되므로 프로그래밍 인터페이스는 기본적으로 동일합니다. 그러나 적어도 필자의 테스트에서는 SDPT3이 몇 초 안에 문제를 해결하는 반면, 수천 개의 변수 및 제약 조건에 대해 훨씬 느리게 실행되고 거의 실패합니다. (나는 CVX가 문제를 좀 더 능률적으로 만들기 위해 멋진 변신을하지만, R에서는 꽤 순진한 정의를 사용하고 있지만 여전히 정당한 비교는하지 못했습니다.)

다른 가능한 것 특히 학업 면허를 취득 할 수있는 경우, R 인터페이스 패키지 Rmosek을 사용하는 상용 Mosek 솔버를 사용하는 것이 좋습니다. 나는 이것을 시험해 보지 못했지만 어느 시점에서 시도해 볼 수있다.

(다른 말로하면 CVX와 함께 번들로 제공되는 SeDuMi는 완전히 동일한 문제를 일으키지 않으며 CVX 작성자는 여러 해결사를 시도 할 때 농담을하지 않습니다 .SDSTP3은 Cholesky에서 LU 분해로 전환하여 처리 순서가 느려지고 이전 LU 단계와 비교하여 목적이 매우 미미한 수준으로 향상되었습니다.이 문제를 피하기 위해 요청 된 정밀도를 줄이는 것이 가치 있다고 생각했지만 YMMV.)

1

새로운 대안이 있습니다 : CVXR, 같은 사람들로부터 온 것입니다. website, papergithub project이 있습니다.

훈육 된 볼록 프로그래밍은 cvxpy (파이썬) 및 Convex.jl (줄리아)을 관찰하면서 인기가 높아지고 있으며, 같은 사람들이 뒷받침합니다.