2

У меня есть вектор A длины N. Также у меня есть N*N матрица C. Я хочу, чтобы максимизировать следующее уравнение:Ограниченная квадратичная оптимизация с помощью библиотеки quadProg

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

Что вы пытаетесь до сих пор? –

+0

Я застрял в самом начале, так как не могу понять, что именно означают эти параметры и как я могу связать свою информацию с теми, которые упомянуты в: 'http://cran.r-project.org/web/packages/quadprog/ quadprog.pdf' – Sangram

ответ

2

Вы можете сделать это с помощью функции 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 
} 

Вы можете проверить его на несколько простых 2-мерных задач:

# 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 
Смежные вопросы