这个问题没有唯一的解。如果您尝试其他初始值来代替w
,那么您很可能会从optim
得到不同的结果。
这个问题可以被描述为解决一个欠定的线性方程组。
A <- matrix(c(rep(1,4),x), nrow=2,byrow=TRUE)
b <- matrix(c(1,n), nrow=2)
我们需要找到一个满足
A %*% w = b
的解决方案,但是应该选择哪个呢?最小范数解?还是其他的解?有无限多个解。可以使用矩阵
A
的伪逆来给出解决方案。请使用
MASS
包进行操作。
library(MASS)
Ag <- ginv(A)
最小范数解是:
wmnorm <- Ag %*% b
请查看线性方程组维基百科页面中的矩阵解法
, 并使用A %*% wmnorm - b
和fn(wmnorm)
进行检查。
解为:
Az <- diag(nrow=nrow(Ag)) - Ag %*% A
w <- wmnorm + Az %*% z
其中z
是一个任意向量,其包含了Az
矩阵的ncol(Az)
个元素。
现在生成一些解并进行检查。
xb <- wmnorm
z <- runif(4)
wsol.2 <- xb + Az %*% z
wsol.2
A %*% wsol.2 - b
fn(wsol.2)
z <- runif(4)
wsol.3 <- xb + Az %*% z
wsol.3
A %*% wsol.2 - b
fn(wsol.3)
当作为参数传递给 fn
时,您会发现这两个解决方案是有效的解决方案。它们与由 optim
找到的解决方案非常不同。您可以通过选择不同的起始点 init_w
来测试这一点,例如通过 init_w1 <- runif(4)/4
。
errs
中每个值在最小化中的重要性?例如:errs <- c(sum(w) - 1, sum(x * w) - n) * c(5,1)
- Marc in the box