给定一个矩阵,我想找到尽可能接近某个目标向量的行的线性组合。另外,我希望行权重是非负的并且总和为1.我尝试使用limSolve包解决问题,但它报告了一个关于矛盾不等式的错误。这是我的功能:
library(limSolve)
find.weights <- function(target.vector, a.matrix) {
# parameters to the objective function
A <- t(a.matrix)
B <- target.vector
# equality constraint (weights sum to 1)
E <- matrix(rep(1, nrow(a.matrix)), nrow = 1)
F <- 1
# inequality constraints (all weights nonnegative)
G <- diag(1, nrow(a.matrix))
H <- rep(0, nrow(a.matrix))
lsei(A = A, B = B, E = E, F = F, G = G, H = H)
}
以下是导致问题的输入。
target.vector:
[1] 0.00 0.30 0.10 0.15 0.15 0.15 0.00 0.15 0.00
a.matrix:
[1,] 0.0000000000 1.0000000 0.000000000 0.0000000 0.00000000 0.0000000 0.000000000 0 0
[2,] 1.0000000000 0.0000000 0.000000000 0.0000000 0.00000000 0.0000000 0.000000000 0 0
[3,] 0.0000000000 0.0000000 0.000000000 0.0000000 0.00000000 0.0000000 0.000000000 1 0
[4,] 0.0000000000 0.0000000 0.000000000 0.0000000 0.00000000 1.0000000 0.000000000 0 0
[5,] 0.0000000000 0.6318000 0.044100000 0.2241000 0.01000000 0.0900000 0.000000000 0 0
[6,] -0.0069249820 0.4961489 0.030322369 0.1164405 0.03519697 0.3167728 0.012043447 0 0
[7,] 0.0410533877 0.2434423 0.007709501 0.0292961 0.06651868 0.5986681 0.013311866 0 0
[8,] 0.0000000000 0.0000000 0.240000000 0.7600000 0.00000000 0.0000000 0.000000000 0 0
[9,] -0.0001006841 0.6229848 0.051032756 0.1945897 0.01236401 0.1112761 0.007853359 0 0
当我使用这些输入调用该函数时,我收到上述错误:
> result <- find.weights(target.vector, a.matrix)
Warning message:
In lsei(A = A, B = B, E = E, F = F, G = G, H = H) :
LSEI error: inequalities contradictory
但是,如果我限制行数或列数,该函数似乎工作正常:
> result <- find.weights(target.vector, a.matrix[1:8,]) # OK
> result <- find.weights(target.vector[1:6], a.matrix[,1:6]) # OK
> result <- find.weights(target.vector[1:7], a.matrix[,1:7]) # NOPE
Warning message:
In lsei(A = A, B = B, E = E, F = F, G = G, H = H) :
LSEI error: inequalities contradictory
任何建议都将不胜感激。
答案 0 :(得分:1)
LSEI error: inequalities contradictory
E
,F
,G
和H
指定的线性约束定义不可行的问题时,会发生。换句话说,当没有向量x
可以同时解决所有E %*% x == F
和G %*% x >= H
约束时。例如,考虑一个会限制两个变量x1
和x2
的问题,x1 + x2 == -1
x_1 >= 0
和x2 >= 0
。显然,没有x1
和x2
值可以满足所有三个约束,并且问题是不可行的。
在您的问题中,n
是要解决的变量数量,您要求的只是x_1
,x_2
,...,x_n
是非负面的,它们总和为1
。一个可行的解决方案(无限多假设n > 1
)是选择x_1 = 1
和x_2 = ... = x_n = 0
。所以先验,lsei
不应该抛出你提到的错误。事实上,您的代码在我的机器上运行良好,我无法重现您所看到的错误。您是否可能使用与此处发布的代码不同的代码获得错误?
答案 1 :(得分:0)
实际上lsei
给出了虚假的“不平等矛盾”。这是一个测试用例:我的约束条件要求解的总和为1(等式),并且要减小(不等式)。
n <- 12
A <- diag(1, 2, n)
B <- c(1, .5)
E <- matrix(1, 1, n)
F <- 1 # pre-set value was FALSE
G <- -diff(diag(1, n+1, n)
H <- numeric(n)
lsei(A, B, E, F, G, H)
第一次运行证明了该问题是可行的。输出:
$X
[1] 0.75 0.25 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
$residualNorm
[1] 4.440892e-16
$solutionNorm
[1] 0.125
$IsError
[1] FALSE
$type
[1] "lsei"
但是随后我更改了A[1,1]
,它与约束无关:
A1 <- diag(c(1000,1),2,n) # change one element
lsei(A=A1, B, E, F, G, H)
使用A1
(病情较轻),它将失败:
$X
[1] -2.6689062 -0.5899748 0.6479330 0.3362563 0.4279018 0.4279018
[7] 0.4279018 0.4279018 0.4279018 0.4279018 0.4279018 0.2793792
$residualNorm
[1] 3.408485
$solutionNorm
[1] 7128401
$IsError
[1] TRUE
$type
[1] "lsei"
Warning message:
In lsei(A = A1, B = B, E = E, F = F, G = G, H = H) :
LSEI error: inequalities contradictory
我认为这表明错误是虚假的,即,这是一个错误。