我有一个(非对称)概率矩阵和一个观察到的整数结果向量。在给定转移矩阵的情况下,我想找到一个最大化结果概率的向量。简单地说,我试图估计海上粒子的分布,因为它们在陆地上的最终分布,以及从海洋中给定点释放的粒子概率矩阵,最终在陆地上的某个点上。
我想要找到的向量受制于所有组件必须介于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软件包可能会有所帮助,但我不认为我有一个对称的正定矩阵......
提前感谢您的帮助!
答案 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),但标准误差非常大。
正如我所说,我从来没有这样做过,所以我不知道它是否有意义。