2015-05-16 8 views
8

Ho esaminato un esempio del corso di Andrew Ng in Machine Learning che ho trovato in https://github.com/jcgillespie/Coursera-Machine-Learning/tree/master/ex3. L'esempio riguarda la regressione logistica e la classificazione uno contro tutti. Ho un dubbio su questa funzione:regressione uno contro tutti

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 

So che il lrCostFunction prende come parametri: theta, X, Y e lambda, ma non riesco a capire da dove il valore di t proviene nel codice che ho postato sopra; specificamente in questa parte:

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

alcun aiuto?

risposta

3

fmincg prende l'handle della funzione obiettivo come primo argomento, che in questo caso è un handle per lrCostFunction.

Se si va dentro fmincg.m, troverete le seguenti linee:

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, ')']; 

Alla fine del frammento di codice di cui sopra, risultato sarà,

argstr=feval(f,X'); 

Se un po 'più avanti, è vedrà,

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

Pertanto, gestire la funzione f verrà eseguito con un argomento X'. Pertanto, t=X', che ha senso anche. L'iniziale theta convergerà per fornire il vettore del parametro finale per la regressione logistica.

3

In realtà è possibile sostituire.

for i=1 : num_labels 

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

all_theta(i,:)=theta; 
+1

Usare formattazione –

+2

utilizzare la formattazione corretta. – Sandeep

+1

cosa fa [theta]? perché non theta (i)? o se è solo per l'assegnazione, perché le parentesi? – nights

1

provare questo

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

anche voi non è necessario inizializzare all_theta in principio