2015-05-16 63 views
8

我一直在回顧機器學習中Andrew Ng課程中的一個例子,我在https://github.com/jcgillespie/Coursera-Machine-Learning/tree/master/ex3中找到了這個例子。這個例子涉及邏輯迴歸和一對一分類。我有一個關於這個功能的疑問:one vs all regression

function [all_theta] = oneVsAll(X, y, num_labels, lambda) 
%ONEVSALL trains multiple logistic regression classifiers and returns all 
%the classifiers in a matrix all_theta, where the i-th row of all_theta 
%corresponds to the classifier for label i 
% [all_theta] = ONEVSALL(X, y, num_labels, lambda) trains num_labels 
% logisitc regression classifiers and returns each of these classifiers 
% in a matrix all_theta, where the i-th row of all_theta corresponds 
% to the classifier for label i 

% Some useful variables 
m = size(X, 1); 
n = size(X, 2); 

% You need to return the following variables correctly 
all_theta = zeros(num_labels, n + 1); 

% Add ones to the X data matrix 
X = [ones(m, 1) X]; 

% ====================== YOUR CODE HERE ====================== 
% Instructions: You should complete the following code to train num_labels 
%    logistic regression classifiers with regularization 
%    parameter lambda. 
% 
% Hint: theta(:) will return a column vector. 
% 
% Hint: You can use y == c to obtain a vector of 1's and 0's that tell use 
%  whether the ground truth is true/false for this class. 
% 
% Note: For this assignment, we recommend using fmincg to optimize the cost 
%  function. It is okay to use a for-loop (for c = 1:num_labels) to 
%  loop over the different classes. 
% 
%  fmincg works similarly to fminunc, but is more efficient when we 
%  are dealing with large number of parameters. 
% 
% Example Code for fmincg: 
% 
%  % Set Initial theta 
%  initial_theta = zeros(n + 1, 1); 
%  
%  % Set options for fminunc 
%  options = optimset('GradObj', 'on', 'MaxIter', 50); 
% 
%  % Run fmincg to obtain the optimal theta 
%  % This function will return theta and the cost 
%  [theta] = ... 
%   fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ... 
%     initial_theta, options); 
% 

initial_theta = zeros(n + 1, 1); 

options = optimset('GradObj', 'on', 'MaxIter', 50); 

for i = 1:num_labels 

    c = i * ones(size(y)); 
    fprintf('valores') 
    [theta] = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options); 
    all_theta(i,:) = theta; 

end 


% ========================================================================= 


end 

我知道lrCostFunction作爲參數:THETA,X,Y和lambda,但我不能從那裏的牛逼價值來自於看着辦吧我上面發佈的代碼;具體在這個部分:

[theta] = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options); 

有幫助嗎?

回答

3

fmincg將目標函數的句柄作爲第一個參數,在這種情況下是lrCostFunction的句柄。

如果你進去fmincg.m,你會發現下面幾行:

argstr = ['feval(f, X'];      % compose string used to call function 

%---Code will not enter the following loop---% 
for i = 1:(nargin - 3) %this will go from 1 to 0, thus the loop is skipped 
    argstr = [argstr, ',P', int2str(i)]; 
end 
% following will be executed 
argstr = [argstr, ')']; 

在上面的代碼片斷結束,結果將是,

argstr=feval(f,X'); 

如果你提前一點點,你將看到,

[f1 df1] = eval(argstr);      % get function value and gradient 

因此,函數句柄f將運行一個參數X'。因此,t=X',這也是有道理的。最初的theta將收斂,爲您提供邏輯迴歸的最終參數向量。

3

你實際上可以替代。

for i=1 : num_labels 

    [theta]= fmincg (@(t)(lrCostFunction(t, X, (y == i), lambda)),initial_theta, options); 

all_theta(i,:)=theta; 
+1

使用正確的格式 –

+2

使用正確的格式初始化all_theta。 – Sandeep

+1

θ做什麼?爲什麼不是theta(i)?或者如果它只是爲了分配,爲什麼括號是? – nights

1

試試這個

for i = 1:num_labels, 
    [all_theta(i,:)] = fmincg (@(t)(lrCostFunction(t, X, (y == i), lambda)), initial_theta, options); 
end; 

你也不必在開始