[R] Optimization of constrained linear least-squares problem
Stefaan Lhermitte
stefaan.lhermitte at biw.kuleuven.be
Fri Mar 18 11:56:41 CET 2005
Thanx Dimitris, Patrick and Berwin!
For other people interested in this problem, here are two valid
solutions that work.
1) Re-parameterize e.g.,
EM <- c(100,0,0,0,100,0,0,0,100)
W <- array(EM, c(3,3))
d <- c(10, 20, 70)
fn <- function(x){
x <- exp(x) / sum(exp(x))
r <- W%*%x - d
crossprod(r, r)[1,1]
}
opt <- optim(rnorm(3), fn)
res <- exp(opt$par) / sum(exp(opt$par))
res
"The first line of the `fn()' function is just a re-pameterization
of your problem, i.e., if `y' is a vector of real numbers, then it
is straightforward to see that `x = exp(y) / sum(exp(y))' will be
real numbers in (0, 1) for which `sum(y)=1'. So instead of finding
xs that minimize your function under the constraint (which is more
difficult) you just find the ys using the above transformation." (I
owe you a drink Dimitris !!!)
2) Or minimize it as a quadratic function under a linear constraint:
EM <- c(100,0,0,0,100,0,0,0,100)
W <- array(EM, c(3,3))
d <- c(10, 20, 70)
library(quadprog)
Dmat <- crossprod(W,W)
dvec <- crossprod(d,W)
A <-matrix(c(1,1,1),ncol=1)
bvec <- 1
solve.QP(Dmat, dvec, A, bvec, meq=1)
This is based on the objective function (i.e. the thing you want to
minimise) : min x'C'Cx - 2 d'Cx + d'd where sum(x) = 1
(Thanx Berwin!!)
Kind regards,
Stef
More information about the R-help
mailing list