gpt4 book ai didi

r - CVXR 矩阵与向量的元素乘法

转载 作者:行者123 更新时间:2023-12-01 19:19:52 24 4
gpt4 key购买 nike

我想使用 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)

as Variable 对象使用矩阵形式,因此后面我们不能像前面的情况那样真正相乘。

此外,我们不想创建 b: Nxp 矩阵,因为我们需要为第 i 列的所有 N 个观测值找到一个最佳值(因此 mul_elemwise(X, X*b) 选项不会' t 工作,因为它会为 N 的不同观测值提供不同的最佳值 - 如果我没有记错的话)。

谢谢

最佳答案

回顾一下:这是 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
>

关于r - CVXR 矩阵与向量的元素乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59224555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com