2016-11-05 3 views
1

Ich versuche, ein Beta-Binomialmodell in Matlab zu schätzen (der Datensatz ist verfügbar here).Optimierung in Matlab: wie man Beschränkungen für Parameter definiert

Meine Likelihood-Funktion:

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); 

Mein Maximum-Likelihood-Schätzcode:

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) 

Allerdings, wenn ich den obigen Code ausführen, erhalte ich eine Fehlermeldung, dass:

Error using gammaln 
Input must be nonnegative. 

was ich glaube, kommt von zufällig negativen Werten zu alpha während optimisi ng der Likelihood-Funktion. Jetzt habe ich mich gefragt, ob es eine Möglichkeit gibt, eine Einschränkung für die Werte zu definieren, die als meine Parameter übergeben werden (alpha und beta), wenn der Optimierungsbefehl ausgeführt wird. Alle Hinweise würden sehr geschätzt werden.

+0

Verwenden fmincon und fügen Sie eine Einschränkung alpha positive –

+0

Dank Matthew zu halten Könntest du mich wissen lassen, wo in meinem Code und wie das möglich ist? Tut mir leid, ich bin sehr neu in Matlab – AliCivil

Antwort

1

fminunc, die Funktion, die Sie derzeit verwenden, findet ein lokales Minimum eines unbeschränkten Optimierungsproblems.

Auf der anderen Seite findet fmincon ein lokales Minimum eines eingeschränkten Optimierungsproblems.

Es scheint, dass Sie eine Einschränkung haben, dass Alpha positiv sein sollte, also sollten Sie fmincon verwenden und die Einschränkung übergeben.

fmincon funktioniert ähnlich wie fminunc. Sie sollten "optimoptions ('fminunc' ..." ändern, um "optoptions ('fmincon' ..." zu lesen)

Sie möchten eine untere Grenze von [0; -inf] setzen, um Alpha nicht negativ zu halten. Für die anderen Eingaben Sie nicht kümmern, übergeben Sie einfach ein leeres Array [].

die documentation for fmincon wird etwas klarer sein, als ich die Zeit haben, hier zu schreiben.

Verwandte Themen