我有一个长度为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规范化(和等于零)。事实上,我以后也可以将它们正常化,但我仍然在想,我是否可以在这里自己做到这一点。
发布于 2015-06-15 19:15:02
您可以使用solve.QP函数来完成这一任务。在?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 (在solve.QP的参数中称为dvec )D = 2pC (在solve.QP的参数中称为Dmat )I'w >= 0。最后的约束可以重新表示为1'w >= 1和-1'w >= -1。因此,约束的A矩阵(Amat在solve.QP的参数中)是一个恒等矩阵,右边附加了一个向量和一个-1向量,右边的b0 (solve.QP参数中的bvec)是一个附加了1和-1的0向量。你可以很容易地把它们放在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.475https://stackoverflow.com/questions/30841622
复制相似问题