我想使用CVXR查找向量的最佳值。在目标函数中,我需要以元素方式将矩阵与向量相乘:
b:Nx1向量 X:Nxp矩阵 结果:Nxp矩阵
示例:
# Set the dims
N <- 50
p <- 5
X <- matrix(rnorm(N*p), N, p)
# to find the optimal values using optim() one could simply have a numeric object
# say the optimal values are 0.1, -0.2, 0.3, -0.5, 0.6
b <- c(0.1, -0.2, 0.3, -0.5, 0.6)
# Then we can have the Nxp matrix with the product
# (where column i of X is multiplied by element i of b) is given by
X*b
b是要优化系数的向量。
使用CVXR必须声明
b <- Variable(p)
作为Variable对象使用矩阵形式,因此以后我们不能像前面那样真正地进行乘法。
此外,我们不想创建b:Nxp的矩阵,因为我们需要为第i列的所有N个观测值拥有一个最佳值(因此mul_elemwise(X,X * b)选项将不会'可以工作,因为它会为N的不同观测值提供不同的最佳值-如果我没记错的话。
谢谢
答案 0 :(得分:1)
回顾一下:这是R行为:
> m <- 2
> n <- 3
> A <- matrix(c(1,2,3,4,5,6),m,n)
> A
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> x <- c(1,2)
> A*x
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 4 8 12
>
这本质上是
A[i,j]*x[i]
幕后的R扩展(回收)x以使其具有与A一样多的元素,然后以列方式进行元素逐个乘法。
在CVXR中,情况有所不同。 %*%用于矩阵乘法,*用于元素乘法。但是CVXR不会执行此回收。因此,对于A * x,要求A和x具有相同的形状(即(mxn)矩阵)。
这意味着我们需要自己进行扩展(回收)。可以这样写:
> x %*% t(rep(1,n))
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 2
所以我们可以这样写:
> A * (x %*% t(rep(1,n)))
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 4 8 12
这是我们在CVXR模型中可以使用的:
> library(CVXR)
> x <- Variable(m)
> Y <- Variable(m,n)
> e <- t(rep(1,n))
> e
[,1] [,2] [,3]
[1,] 1 1 1
> problem <- Problem(Minimize(0),list(x == c(1,2), Y == A * (x %*% e)) )
> sol <- solve(problem)
> sol$status
[1] "optimal"
> sol$getValue(x)
[,1]
[1,] 1
[2,] 2
> sol$getValue(Y)
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 4 8 12
>