矢量的约束优化

时间:2015-11-04 04:25:24

标签: r optimization constraints

我有一个(非对称)概率矩阵和一个观察到的整数结果向量。在给定转移矩阵的情况下,我想找到一个最大化结果概率的向量。简单地说,我试图估计海上粒子的分布,因为它们在陆地上的最终分布,以及从海洋中给定点释放的粒子概率矩阵,最终在陆地上的某个点上。

我想要找到的向量受制于所有组件必须介于0-1之间的约束,并且组件的总和必须等于1.我试图找出问题的最佳优化方法。 / p>

我的转换矩阵和数据集非常大,但我在这里创建了一个较小的一个:

我使用了模拟的已知海上分布 msim<-c(.3,.2,.1,.3,.1,0)和模拟概率矩阵(t)得出估计的沿海矩阵(Datasim2),如下:

t<-matrix (c(0,.1,.1,.1,.1,.2,0,.1,0,0,.3,0,0,0,0,.4,.1,.3,0,.1,0,.1,.4,0,0,0,.1,0,.1,.1),
nrow=5,ncol=6, byrow=T)
rownames(t)<-c("C1","C2","C3","C4","C5") ### locations on land
colnames(t)<-c("S1","S2","S3","S4","S5","S6") ### locations at sea

Datasim<-as.numeric (round((t %*% msim)*500))

Datasim2<-c(rep("C1",95), rep("C2",35), rep("C3",90),rep("C4",15),rep("C5",30))
M <-c(0.1,0.1,0.1,0.1,0.1,0.1) ## starting M

我从一个简单的功能开始如下:

EstimateSource3<-function(M,Data,T){

EstEndProbsall<-M%*%T
  TotalLkhd<-rep(NA, times=dim(Data)[1])

  for (j in 1:dim(Data)[1]){

ObsEstEndLkhd<-0
    ObsEstEndLkhd<-1-EstEndProbsall[1,]  ## likelihood of particle NOT ending up at locations other than the location of interest

      IndexC<-which(colnames(EstEndProbsall)==Data$LocationCode[j], arr.ind=T) ## likelihood of ending up at location of interest

      ObsEstEndLkhd[IndexC]<-EstEndProbsall[IndexC]

      #Total likelihood
      TotalLkhd[j]<-sum(log(ObsEstEndLkhd)) 
  }

  SumTotalLkhd<-sum(TotalLkhd)


  return(SumTotalLkhd)
}

DistributionEstimate <- optim(par = M, fn = EstimateSource3, Data = Datasim2, T=t, 
control = list(fnscale = -1, trace=5, maxit=500), lower = 0, upper = 1)

要将总和限制为1,我尝试使用此处发布的一些建议:How to set parameters' sum to 1 in constrained optimization

e.g。将M<-M/sum(M)SumTotalLkhd<-SumTotalLkhd-(10*pwr)添加到函数体中,但两者都没有产生类似msim的东西,实际上,第二个解决方案出现了错误“L-BFGS-B需要&#的有限值39; FN&#39;”

我想也许quadprog软件包可能会有所帮助,但我不认为我有一个对称的正定矩阵......

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

怎么样:设D =陆地上的分布,M =海上,T是过渡矩阵。你知道D,T,你想要计算M.你有

d&#39; = M&#39; T

因此D&#39; T&#39; = M&#39; (T T&#39;)

因此D&#39;(T T&#39;)^( - 1)= M&#39;

基本上你在进行线性回归时解决它(似乎SO不支持数学符号:&#39;是转置,^( - 1)是普通矩阵逆。)

或者,D可能是粒子数,现在您可以提出以下问题:海上最可能的粒子分布。这需要一种不同的方法。

答案 1 :(得分:0)

好吧,我从未做过这样的模特,但是按照以下思路思考。令M为长度3,D为长度2,因此T为3×2。我们知道T,我们观察到位置1处的D_1粒子和位置2处的D_2粒子。

在D_1位置观察一个粒子的可能性有多大?它是 Pr(D = 1)= M_1 T_11 + M_2 T_21 + M_3 T_32 。类似地, Pr(D = 2)= M_1 T_12 + M_2 T_22 + M_3 T_32 。现在,您可以轻松编写在位置1和2处观察D_1和D_2粒子的对数似然性。代码可能如下所示:

loglik <- function(M) {
   if(M[1] < 0 | M[1] > 1)
      return(NA)
   if(M[2] < 0 | M[2] > 1)
      return(NA)
   M3 <- 1 - M[1] - M[2]
   if(M3 < 0 | M3 > 1)
      return(NA)
   D[1]*log(T[1,1]*M[1] + T[2,1]*M[2] + T[3,1]*M3) +
       D[2]*log(T[1,2]*M[1] + T[2,2]*M[2] + T[3,2]*M3)
}
T <- matrix(c(0.1,0.2,0.3,0.9,0.8,0.7), 3, 2)
D <- c(100,200)
library(maxLik)
m <- maxLik(loglik, start=c(0.4,0.4), method="BFGS")
summary(m)

我估计时会得到答案(0,0.2,0.8),但标准误差非常大。

正如我所说,我从来没有这样做过,所以我不知道它是否有意义。