2013-12-11 39 views
1

我想最大化10個變量的函數。我用下面這段代碼做到這一點:在Matlab中使用約束最小化時的NaN?

b = [1 2 3 4 1 7 -1 -4 9 1].';  %// initial value of the decision variable 
goal = @(b) -sum(F(b)); 

因爲我想最大化F對於給定b組參數,其中最後值應≥0我實現了優化如下:

%// lower bounds for decision variable 
lb = [-inf(1,9) 0]; 

%// upper bounds for decision variable 
ub = inf(1,10); 

myfminoptions = optimset('Display','Iter', 'Algorithm','active-set'); 
theta1 = fmincon(goal, theta0, [],[],[],[], lb,ub, [], myfminoptions); 

也就是說,我找到函數的負數的最小值,它應該與查找該函數的最大值相同。

我的問題是,對於每次迭代,我得到的一階最優性是Inf,因此'Hessian not updated'

此外,我的功能NaN在第一次迭代中的值,我簡直不明白。這可能是原因,但我不確定。

編輯

這是我使用的功能:

function ll = mytobit(theta); 
global x y; 
b=theta(1:size(theta,1)-1); 
s=theta(size(theta,1)); 
ll = (y==0).*log(1-normcdf(x*b/s))+ (y>0).*(-0.5*(log(2*pi)+log(s^2)+(y-x*b).^2/s^2)); 
return; 

當呼籲theta0的功能,我得到N個似然值(N是X中的行數和Y),我應該這樣做。

Y和X的一個例子:

Y = [0;0;2047;1890;1975] 

    X = [2300, 34, 1156, 0, 1; 
     2100, 35, 1225, 0, 1; 
     2760, 36, 1296, 1, 0; 
     2300, 37, 1369, 1, 0 
     2455, 38, 1444, 0, 0] 
+0

什麼是'功能(b)'?是'theta0 == b'? –

+0

是的,對不起。 theta0 = B.該函數是一個用於一個模型的似然函數,該模型包含一些獨立變量(x)變量和一些因變量(y)。該函數然後返回數據集中每個人的一些似然值。 – Jesper

+0

你可以粘貼該功能的玩具版本嗎?我希望能夠重現您的錯誤...原則上,您所做的事情沒有任何問題,所以我懷疑問題在於該功能。 –

回答

0

你或許應該使用的「小數量議定書」的算法,而不是有效集。 sqp算法可以從s偏離接近於零時產生的NaN中恢復,其中衍生物是未定義的。

此外,您希望不會在theta0中初始化接近零的s變量。

因爲s實際上應該嚴格大於零,所以可能有助於將其重新表達爲s = exp(-d/2),其中d是一個新的無約束未知變量。另外,你的目標函數只取決於b的數量B = b/s。所以,你可以用這種方式來制定

ll = (y==0).*log(1-normcdf(x*B))+ (y>0).*(-0.5*(log(2*pi)-d+(y*exp(-d/2)-x*B).^2)); 

現在,函數或其衍生物中沒有不明確的區域。