我一直在尝试最小化函数\sum n_i*log(p_i)
,其中p_i是未知的概率参数,满足通常的约束条件,即p_i>0
和\sum(p_i)=1
。
此外,我有p_1<=p_2<=...<=p_(11)>=p_(12)>=...>=p(21)
形式的约束。我打算在上面使用R中的alabama软件包。我写了一个代码 -
############## Generating multinomial with specified probability ##################
p=seq(0.01,0.01+9*0.007,0.007)
pr=c(p,(1-2*sum(p)),rev(p))
y=sample(21,1000,prob=pr,replace=T)
############### Obtaining Frequency distribution #################
freq=numeric(21)
for(i in 1:21)
freq[i]=sum(as.numeric(y==i))
############# Negative Log-likelihood #################
fn=function(x)
{
sum=0
for(i in 1:21)
sum=sum+freq[i]*log(x[i])
return(-sum)
}
############# Gradient vector #################
gr=function(x)
{
g=numeric(length(x))
for(i in 1:length(x))
g[i]=freq[i]/x[i]
return(g)
}
############# Equality constraints ################
heq=function(x)
{
h=rep(0,1)
h=sum(x)-1
return(h)
}
heq.jac=function(x)
{
j=matrix(0,1,length(x))
j[1,]=rep(1,length(x))
return(j)
}
############## Inequality constraints ################
hin=function(x)
{
h=rep(0,41)
for(i in 1:21)
{
h[i+20]=x[i]
}
for(i in 1:20)
{
if(i<=10)
h[i]=x[i+1]-x[i]
if(i>10)
h[i]=x[i]-x[i+1]
}
return(h)
}
hin.jac=function(x)
{
j=matrix(0,41,21)
for(i in 1:21)
j[(i+20),i]=1
for(i in 1:20)
{
if(i<=10)
{
j[i,(i+1)]=1
j[i,i]=-1
}
if(i>10)
{
j[i,i]=1
j[i,(i+1)]=-1
}
}
return(j)
}
################ Function call ##################
init=runif(21,0,1)
est=auglag(par=init, fn=fn, gr=gr, heq=heq, heq.jac=heq.jac, hin=hin, hin.jac=hin.jac)
现在上面的代码片段不起作用。该算法不收敛而是产生警告,即
In log(x[i]) : NaNs produced
你能帮我弄清楚我哪里出错了吗?谢谢。
P.S。我确实理解代码中存在一些冗余约束。