我正在尝试在Matlab中估计Beta-Binomial模型(数据集可用here)。
我的可能性功能:
function out= log_Lik(x,Data);
ms=Data(:,1);
xs=Data (:,2);
alpha=x(1)
beta=x(2)
P12=exp(gammaln(ms+1)-gammaln(xs+1)-gammaln(ms- xs+1)).*exp(gammaln(alpha+xs)+gammaln(beta+ms-xs)-gammaln(alpha+beta+ms));
P3= exp(gammaln(alpha+beta)-gammaln(alpha)-gammaln(beta));
P=P12.*P3;
Like=log(P);
out= -sum(Like);
我的最大似然估计代码:
Data=readtable('prob3.xls');
ms=Data.m_s;
xs=Data.x_s;
%% Data parsed to optimisation function
Data = [ms xs ];
f = @(x)log_Lik(x, Data);
%%
options = optimoptions('fminunc','Display','iter','Algorithm','quasi- newton','MaxIter',10000,'TolX',10^-30,'TolFun',10^-30);
alpha0 = 1;
beta0=1;
x0 = [alpha0 beta0];
[x,fval,exitflag,output,grad,hessian] = fminunc(f,x0,options)
但是,当我运行上面的代码时,我收到一条错误说:
Error using gammaln
Input must be nonnegative.
我认为这是在优化似然函数的同时将随机负值传递给alpha
。现在我想知道在运行优化命令时是否有任何方法可以为作为我的参数(alpha
和beta
)传递的值定义约束。任何提示都将受到高度赞赏。
答案 0 :(得分:1)
fminunc
,您当前使用的函数,找到无约束优化问题的局部最小值。
另一方面,fmincon找到约束优化问题的局部最小值。
看来你有一个约束,alpha应该是正数,所以你应该使用fmincon并传入约束。
fmincon与fminunc类似。你应该改变“optimoptions('fminunc'...”来读取“optimoptions('fmincon'......”
您希望设置[0; -inf]
的下限以保持alpha非负数。对于您不关心的其他输入,只需传递一个空数组[]
。
documentation for fmincon比我在这里写的任何东西都要清晰。