【问题标题】:Minimize distance between matrices subject to row and column margin constraints最小化受行和列边距约束的矩阵之间的距离
【发布时间】:2013-08-26 22:05:49
【问题描述】:

我想求解一个具有预定行和列总计的矩阵,该矩阵最接近于具有相同属性(但可能具有不同的行/列总计)的第二个预定矩阵。

因此,两个矩阵必须满足以下条件: 的所有元素必须在 [0,1] 范围内。

列号小于行号的任何元素在解中都必须为 0。

列号大于行号+2的任何元素都必须为0。

所以从这样开始:

0.07    0.17    0.47    0.29        

0.07    0.1     0.14    0        0.31
0       0.07    0.18    0.07     0.32
0       0       0.15    0.04     0.19
0       0       0       0.18     0.18

我想尽量减少到这里的“距离”:

0.10    0.21    0.37    0.32        

0.10    0.11    0.12    0        0.33
0       0.10    0.13    0.10     0.33
0       0       0.12    0.09     0.21
0       0       0       0.13     0.13

这样可以保留第一个矩阵的原始行和列总计。我将在这里将距离定义为每个矩阵中第 i 个、第 j 个条目之间的平方差之和,但如果由于某种原因这是一个问题,我可以使用其他度量。

到目前为止,我一直在尝试使用 Rsolnp 包中的 solnp 来执行此操作,如下所示:

rowVals<-c(.31,.32,.19,.18)
colVals<-c(.07,.17,.47,.29)
In<-c(.07,.15,.1,.18,.04,.14,.07)
tar<-c(.1,.11,.12,0,0,.1,.13,.1,0,0,.12,.09,0,0,0,.13)
tar<-matrix(tar,byrow=T,nrow=4)


makeMat <- function(x,n) {
  ## first and last element of diag are constrained by row/col sums
  diagVals <- c(colVals[1],x[1:(n-2)],rowVals[n])
  ## set up off-diagonals 2,3,4,5,6
  sup2Vals <- x[(n-1):(2*n-3)]
  sup3Vals <- x[(2*n-2):(3*n-5)]

  ## set up matrix
  m <- diag(diagVals)
  m[row(m)==col(m)-1] <- sup2Vals
  m[row(m)==col(m)-2] <- sup3Vals
  m
}


##objective function
fn<-function(inpt, targt, n, ...){
  x<-makeMat(inpt, n=n)
  y<-targt
  z<-sum((x-y)^2)
  z
}

##equality constraint function
eq<-function(x,...){c(rowSums(makeMat(x,length(rowVals))),colSums(makeMat(x,length(colVals))))}
##row/column constraints
eqB<-c(rowVals, colVals)


opt1<-solnp(pars = In, fun = fn, eqfun = eq, eqB = eqB, LB = rep(0,7), targt = tar, n=4)

但是,当我尝试解决时,我收到了这个错误:

solnp-->Redundant constraints were found. Poor
solnp-->intermediate results may result.Suggest that you
solnp-->remove redundant constraints and re-OPTIMIZE

Iter: 1 fn: 0.0116   Pars:  0.07000 0.15000 0.10000 0.18000 0.04000 0.14000 0.07000
solnp--> Solution not reliable....Problem Inverting Hessian.

我也遇到过这样的情况:

Error in solve.default(a %*% t(a), constraint, tol = 2.220446e-16) : 
  Lapack routine dgesv: system is exactly singular: U[4,4] = 0

我希望我对这个问题的解释足够清楚;任何有关我如何处理此问题的建议将不胜感激。

谢谢。

【问题讨论】:

  • 你对行和列元素总和的约束是多余的(一旦你知道所有列的总和,你就知道所有元素的总和):尝试删除一个,例如,第一行元素的总和。

标签: r optimization matrix linear-algebra


【解决方案1】:

谢谢!

看起来对等式约束函数使用这样的东西是可行的:

##equality constraint function
eq<-function(x,...){c(rowSums(makeMat(x,length(rowVals)))[-c(4,3)],colSums(makeMat(x,length(colVals)))[-1])}
##row/column constraints
eqB<-c(rowVals[-c(4,3)], colVals[-1])

【讨论】:

    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2022-11-21
    相关资源
    最近更新 更多