【问题标题】:Quadratic Programming Setting up Constraint二次规划设置约束
【发布时间】:2019-11-22 18:30:58
【问题描述】:

我正在尝试建立一个简单的 OLS 模型,并对 R 中的系数进行约束。下面的代码正在运行。然而,这表明

y = c + a1x1 + a2x2 + a3x3 约束 a1+a2 = 1

我想将此约束修改为: a1*a2 - a3 = 0

感谢您的帮助!

工作代码:

'''

    set.seed(1000) 
    n <- 20
    x1 <- seq(100,length.out=n)+rnorm(n,0,2)
    x2 <- seq(50,length.out=n)+rnorm(n,0,2)
    x3 <- seq(10,length.out=n)+rnorm(n,0,2)
    constant <- 100
    ymat <- constant + .5*x1 + .5*x2 + .75*x3 + rnorm(n,0,4)
    xmat <- cbind(x1,x2,x3)

    X <- cbind(rep(1,n),xmat) # explicitly include vector for constant
    bh <- solve(t(X)%*%X)%*%t(X)%*%ymat

    XX <- solve(t(X)%*%X)
    cmat <- matrix(1,1,1) 
    Q <- matrix(c(0,1,1,0),ncol(X),1) # a1+a2=1 for y = c + a1x1 + a2x2 + a3x3
    bc <- bh-XX%*%Q%*%solve(t(Q)%*%XX%*%Q)%*%(t(Q)%*%bh-cmat)

   library(quadprog)
   d <- t(ymat) %*% X
   Rinv = solve(chol(t(X)%*%X)) 
   qp <- solve.QP(Dmat=Rinv, dvec=d, Amat=Q, bvec=cmat, meq=1, factorized=TRUE)
   qp

   cbind(bh,qp$unconstrained.solution)
   cbind(bc,qp$solution)

'''

【问题讨论】:

    标签: r constraints quadratic-programming


    【解决方案1】:

    假设问题是最小化 || ymat - X b || ^2 受限于 b[2] * b[3] == b[4] 我们可以替换 b[4] 给出如下所示的无约束 nls 问题。下面的b 是b 的前3 个元素,我们可以通过将下面的b 的最后两个元素相乘得到b[4]。没有使用任何包。

    fm <- nls(ymat ~ X %*% c(b, b[2] * b[3]), start = list(b = 0:2))
    fm
    

    给予:

    Nonlinear regression model
      model: ymat ~ X %*% c(b, b[2] * b[3])
       data: parent.frame()
         b1      b2      b3 
    76.9718  0.6275  0.7598 
     residual sum-of-squares: 204
    
    Number of iterations to convergence: 4 
    Achieved convergence tolerance: 6.555e-06
    

    计算 b4

    prod(coef(fm)[-1])
    ## [1] 0.476805
    

    注意

    以类似的方式,可以将原始问题(以最小化相同目标但具有原始约束)简化为无约束问题并使用nls 通过替换解决:

    nls(ymat ~ X %*% c(b[1], b[2], 1-b[2], b[3]), start = list(b = 0:2))
    

    给予:

    Nonlinear regression model
      model: ymat ~ X %*% c(b[1], b[2], 1 - b[2], b[3])
       data: parent.frame()
          b1       b2       b3 
    105.3186   0.3931   0.7964 
     residual sum-of-squares: 222.3
    
    Number of iterations to convergence: 1 
    Achieved convergence tolerance: 4.838e-08
    

    甚至可以重新参数化以使 lm 可以解决这个原始问题

    lm(ymat ~ I(X[, 2] - X[, 3]) + X[, 4] + offset(X[, 3]))
    

    给予

    Call:
      lm(formula = ymat ~ I(X[, 2] - X[, 3]) + X[, 4] + offset(X[, 3]))
    
    Coefficients:
           (Intercept)  I(X[, 2] - X[, 3])              X[, 4]  
              105.3186              0.3931              0.7964  
    

    【讨论】:

      【解决方案2】:

      G. grothendieck - 感谢您的回复。不幸的是,这对我不起作用。

      我决定长期计算拉格朗日,结果太复杂了,我无法解决。

      然后意识到,

      a1*a2-a3 =0 
      a1*a2 = a3
      ln(a1*a2)= ln(a3)
      ln(a1) + ln(a2) -ln(a3) = 0
      

      这给我留下了一个附加约束,我可以用 quadprog 包解决它。

      【讨论】:

        【解决方案3】:

        也许你可以试试下面的代码,使用fmincon()

        library(pracma)
        library(NlcOptim)
        # define objective function
        fn <- function(v) norm(ymat- as.vector( xmat %*% v),"2")
        # the constraint a1*a2 - a3 = 0
        heq1 = function(v) prod(v[1:2])-v[3] 
        # solve a1, a2 and a3 
        res <- fmincon(0:2,fn,heq = heq1)
        

        这样

        > res$par
        [1]  1.9043754 -0.1781830 -0.3393272
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-24
          • 1970-01-01
          • 2023-03-28
          相关资源
          最近更新 更多