2015-05-16 16 views
8

Przeglądałem przykład z kursu Andrew Nga w uczeniu maszynowym, który znalazłem w https://github.com/jcgillespie/Coursera-Machine-Learning/tree/master/ex3. Przykład dotyczy regresji logistycznej i klasyfikacji jeden/wszystkie. Mam wątpliwości z funkcji:Jedna kontra cała regresja

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 

wiem, że lrCostFunction przyjmuje jako parametry: theta, X, Y i lambda, ale nie może zrozumieć to, z którego wartość t pochodzi w kod, który napisałem powyżej; w szczególności w tej części: jakakolwiek pomoc?

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

jakiejkolwiek pomocy?

Odpowiedz

3

fmincg przejmuje uchwyt funkcji celu jako pierwszy argument, który w tym przypadku jest uchwytem do lrCostFunction.

Jeśli pójdziesz wewnątrz fmincg.m znajdziesz następujące linie:

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

Pod koniec kodu powyższym fragmencie, wynik będzie,

argstr=feval(f,X'); 

Jeśli trochę naprzód, ty zobacz,

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

Dlatego uchwyt funkcji f uruchomi się z argumentem X'. Dlatego też, t=X', co ma również sens. Początkowe theta zbiegnie się, aby uzyskać ostateczny wektor parametrów regresji logistycznej.

3

Można faktycznie zastąpić.

for i=1 : num_labels 

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

all_theta(i,:)=theta; 
+1

Zastosowanie właściwego formatowania –

+2

Zastosowanie właściwego formatowania. – Sandeep

+1

co robi? dlaczego nie theta (i)? lub jeśli jest to tylko zadanie, dlaczego w ogóle zamki? – nights

1

spróbować

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

również nie trzeba zainicjować all_theta na początku