Квадратичная оптимизация с использованием библиотеки 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
Другие вопросы по тегам