Мне нужно решить (много раз, для большого количества данных, наряду с множеством других вещей) то, что, по моему мнению, сводится к программа конуса второго порядка. Это можно кратко выразить в CVX примерно так:
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
Показанные длины данных и шаблоны ограничений равенства - это просто произвольные значения из некоторых тестовых данных, но общая форма будет почти такой же, с двумя объективными условиями: один минимизирует ошибку, другой поощряет разреженность - и большим количеством ограничений равенства. на элементах преобразованной версии переменной оптимизации (которая сама должна быть неотрицательной).
Кажется, это работает довольно хорошо, намного лучше, чем мой предыдущий подход, который подделывает ограничения чем-то гнилым. Проблема в том, что все остальное происходит в R, и было бы довольно неприятно переносить это на Matlab. Так жизнеспособно ли это в R, и если да, то как?
На самом деле это сводится к двум отдельным вопросам:
1) Есть ли для этого хорошие ресурсы R? Насколько я могу судить по странице задач CRAN, пакет SOCP варианты: CLSCOP и DWD, который включает в себя решатель SOCP в качестве дополнения к своему классификатору. Оба имеют схожие, но довольно непрозрачные интерфейсы и немного скудны в документации и примерах, что подводит нас к:
2) Как лучше всего представить указанную выше проблему в формате блока ограничений, используемом этими пакетами? Синтаксис CVX выше скрывает много утомительной возни с дополнительными переменными и т. был бы очень рад ...
M %*% x
наy-z
и добавить ограниченияy >= 0
,z >= 0
; замените норму L ^ 2 дляA %*% x - b
наt
и добавьте ограниченияt >= sqrt( t(u) %*% u )
,u = A %*% x - b
. Большинство этих преобразований можно даже автоматизировать, как в случае с CVX. , но для такой простой проблемы, вероятно, не стоит беспокоиться. - person Vincent Zoonekynd   schedule 27.04.2013DWD::sqlp
илиCLSOCP::socp
недокументирован: вам сообщают, какой аргумент содержит ограничения, но не то, как они закодированы ... Вы можете попытаться связаться с авторами этих пакетов, чтобы получить дополнительную информацию о кодировке ограничения. Вы также можете посмотреть на пакетRcsdp
: он решает более широкий класс проблем (полуопределенные программы), входные данные задокументированы, но преобразование вашей проблемы в желаемую форму не будет таким простым ... - person Vincent Zoonekynd   schedule 27.04.2013DWD::sqlp
выглядит смоделированным на SDPT3, поэтому можно было бы уточнить вводные данные путем сравнения. - person walkytalky   schedule 27.04.2013