Квадратичная оптимизация с использованием библиотеки quadProg
У меня есть вектор A
длины N
, Также у меня есть N*N
матрица C
, Я хочу максимизировать следующее уравнение:
minimize (- (w_transpose * A) + p * w_transpose * C * w)
куда w
вектор длины N
с ограничениями, которые каждый w
неотрицательно и сумма всех w
это 1.
Я видел пакет под названием quadProg
, Там мне нужно указать:
Dmat = C
, dvec = A
, а также bvec = w
но не уверен, как применять вышеупомянутые ограничения там.
Я полагаю, я мог бы предоставить Amat
быть матрицей идентичности, которая сохранит все w
неотрицательным. Но не уверен, как сохранить w
нормализуется (сумма равна нулю). На самом деле я мог бы нормализовать их и позже, но все еще задавался вопросом, смогу ли я сделать это здесь сам.
1 ответ
Вы можете сделать это с solve.QP
функция от quadprog. От ?solve.QP
мы читаем что solve.QP
решает системы вида min_b {-d'b + 0.5 b'Db | A'b >= b0}
, Вы решаете проблему формы min_w {-A'w + pw'Cw | w >= 0, 1'w = 1}
, Таким образом, отображение между формами:
d = A
(это называетсяdvec
в аргументахsolve.QP
)D = 2pC
(это называетсяDmat
в аргументахsolve.QP
)- Для первого набора ограничений у вас есть
I'w >= 0
, Окончательное ограничение может быть переформулировано как1'w >= 1
а также-1'w >= -1
, Поэтому ваша матрица ограничений (Amat
в аргументахsolve.QP
) - единичная матрица с вектором 1 и вектором -1, добавленным справа, а правая часть b0 (bvec
в аргументахsolve.QP
) - это вектор 0 с добавлением 1 и -1.
Вы можете сложить все это в R довольно легко:
library(quadprog)
solve.my.QP <- function(A, p, C) {
solve.QP(Dmat=2*p*C,
dvec=A,
Amat=cbind(diag(1, length(A)), rep(1, length(A)), rep(-1, length(A))),
bvec=c(rep(0, length(A)), 1, -1))$solution
}
Вы можете проверить это на некоторых простых двумерных задачах:
# Even penalty
solve.my.QP(c(0, 0), 1, diag(1, 2))
# [1] 0.5 0.5
# Encourage inclusion of first variable
solve.my.QP(c(0.1, 0), 1, diag(1, 2))
# [1] 0.525 0.475