Используя M
, определенно воспроизводимый в примечании, в конце мы находим b
, который минимизирует следующую цель, где b
- это вектор 0/1:
sum((b %*% M - c(0, 0, 5, 5))^2)
1) CVXR Используя пакет CVXR, мы получаем решение c (1, 0, 0, 1, 1), что означает выбор строк 1, 4 и 5.
library(CVXR)
b <- Bool(n)
pred <- t(b) %*% M
y <- c(0, 0, 5, 5)
objective <- Minimize(sum((t(y) - pred)^2))
problem <- Problem(objective)
soln <- solve(problem)
bval <- soln$getValue(b)
zapsmall(c(bval))
## [1] 1 0 0 1 1
2) BruteСила В качестве альтернативы, поскольку есть только 5 строк, есть только 2 ^ 5 возможных решений, поэтому мы можем попробовать их все и выбрать тот, который минимизирует цель.Сначала мы вычисляем матрицу solns
с 2 ^ 5 столбцами, так что каждый столбец является одним из возможных решений.Затем мы вычисляем целевую функцию для каждого столбца и выбираем тот, который минимизирует ее.
n <- nrow(M)
inverse.which <- function(ix, n) replace(integer(n), ix, 1)
L <- lapply(0:n, function(i) apply(combn(n, i), 2, inverse.which, n))
solns <- do.call(cbind, L)
pred <- t(t(solns) %*% M)
obj <- colSums((pred - c(0, 0, 5, 5))^2)
solns[, which.min(obj)]
## [1] 1 0 0 1 1
Примечание
M <- matrix(c(.38, -.25, .78, .83, -.65,
.24, -.35, .44, -.88, .15,
3, 5, 13, -15, 18,
18, -7, 23, -19, 7), 5)