2012-05-02 97 views
1

我一直試圖在matlab中實現邏輯迴歸一段時間。我已經完成了它,但對於我未知的回放,我無法使用fminunc執行一次迭代。當它調用的函數,程序無限期地進入等待模式。代碼有問題嗎,還是我的數據集很大?matlab fminunc不退出(無限期運行)

function [theta J] = logisticReg(initial_theta, X, y, lambda, iter) 

% Set Options 
options = optimset('GradObj', 'on', 'MaxIter', iter); 

% Optimize 
[theta, J, exit_flag] = fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options); 

end 

其中

X is a [676,6251] matrix 
y is a [676,1] vector 
lambda = 1 
initial_theta is [6251, 1] vector of zeros 
iter = 1 

任何 '在正確的方向指向' 將不勝感激! P.S.我能夠運行costFunctionReg。所以我假設它是這個功能。

按要求costFunctionReg

function [J, grad] = costFunctionReg(theta, X, y, lambda) 

m = length(y); % number of training examples 

J = 0; 
grad = zeros(size(theta)); 

hyp = sigmoid(X * theta); 
cost_reg = (lambda/(2*m)) * sum(theta(2:end).^2); 

J = 1/m * sum((-y .* log(hyp)) - ((1-y) .* log(1-hyp))) + cost_reg; 


grad(1) = 1/m * sum((hyp - y)' * X(:,1)); 
grad(2:end) = (1/m * ((hyp - y)' * X(:,2:end))) + (lambda/m)*theta(2:end)'; 

回答@Rasman問題:

Cost at initial theta: NaN 
press any key to continue 
Performing Logistic Regrestion 
Error using sfminbx (line 28) 
Objective function is undefined at initial point. fminunc cannot continue. 

Error in fminunc (line 406) 
    [x,FVAL,~,EXITFLAG,OUTPUT,GRAD,HESSIAN] = sfminbx(funfcn,x,l,u, ... 

Error in logisticReg (line 8) 
[theta, J, exit_flag] = fminunc(@(t)(costFunctionReg(t, X, y, lambda)), 
initial_theta, options); 

Error in main (line 40) 
[theta J] = logisticReg(initial_theta, X, y, lambda, iter); 

第一行是我跑costFunctionReg與initial_theta。

+0

你可以顯示'costFunctionReg' - 很可能是這個問題。也許可以設置'MaxFunEvals' - 也許你需要在每次迭代中進行如此多的計算。 – bdecaf

+0

我建議你在調試器中啓動你的代碼,並在代價函數中設置一個斷點,以查看你是否達到它,如果是的話,它會發生什麼。 – silvado

+0

嘿,快問題。我對機器學習仍然陌生。我實際上正在嘗試解決分類問題。這是我的問題的一個可能的原因? – cubearth

回答

0

這有可能是你已經嘗試過搜索此鏈接: http://www.mathworks.com/matlabcentral/newsreader/view_thread/290418

一般弧(我已經複製並粘貼/製作編輯從上述網站的文字)是:

錯誤信息表示在x0點評估時,您的目標函數「obj」爲 錯誤或返回值和無效值,例如Inf,NaN或複數 。

您可能需要調用fmincon前先評估你在x0函數(或你的情況,fminunc),看看它是否明確定義:像

costFunctionReg(initial_theta) 

如果你的函數(costFunctionReg)是返回複數值結果,然後使用real()將其去掉。