我想求解一个具有预定行和列总数的矩阵,该矩阵与具有相同属性(但可能具有不同行/列总数)的第二个预定矩阵最为相似。
因此,两个矩阵都必须满足以下条件:的所有元素都必须在[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
我希望我已经足够清楚地解释了这个问题;如果我能就如何处理这件事提出任何建议,我们将不胜感激。
谢谢。
谢谢!
它看起来像是使用这样的东西来实现等式约束函数的工作:
##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])