使用R

时间:2016-07-31 19:50:31

标签: r optimization

我一直在尝试最小化函数\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。我确实理解代码中存在一些冗余约束。

0 个答案:

没有答案