Эффективная квадратичная оптимизация с простым линейным ограничением MatLab с использованием CVX
(Извините за форматирование, я буду стараться изо всех сил) Я хочу решить:
x = argmin_x (Ax - p)'(Ax - p)
s.t. x >= b
где A
это NxH
логическая матрица (примерно половина нулей, половина), b
это Hx1
постоянный вектор, где каждая запись одинакова (например, b = (0.1,0.1,0.1,...)
, p
постоянная Nx1
вектор вероятностей, поэтому все записи находятся в [0,1]
, оптимальный x
это также дистрибутив, поэтому все его записи должны быть в [0,1]
, Обратите внимание, что на практике H
очень большой, например 2 million
а также N
относительно мала, например 150
,
Я в настоящее время использую CVX, чтобы решить эту проблему. Явно мой код:
b= 0.1.*ones(H,1)/H;
cvx_begin quiet
variable x(H)
minimize( norm((A*x-p),2))
subject to
x >= b;
cvx_end
Это дает правильный результат. Тем не менее, это довольно медленно, когда H
большой. Учитывая структуру моей программы оптимизации (логический A, постоянное ограничение, проблема, которая имеет аналитическое решение, если не было ограничений, и т. Д.), Есть ли лучший способ приблизиться к этому? Здесь рекомендуется CVX?
Спасибо за помощь.