ex3-1 Multi-class classification


lrCostFunction.m

function [J, grad] = lrCostFunction(theta, X, y, lambda)  
...(중략)  

hx = X * theta;  
gx = sigmoid(hx);  

% Cost function J  
pos = -y' * log(gx);  
neg = (1 - y)' * log(1 - gx);  
regular = lambda / (2 * m) * sum(theta(2:end) .^ 2);  

J = (1 / m) * (pos - neg) + regular;  

% Gradient descent  

grad = (1/m) * X' * (gx - y) + (lambda/m) .* theta;  
grad(1) = (1/m) * X(:,1)' * (gx - y);

oneVsAll.m


function [all_theta] = oneVsAll(X, y, num_labels, lambda)  
...(중략)  

for c = 1:num_labels  
    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);  

    all_theta(c,:) = theta';  
end

' 위에서 만든 lrCostFunction 을 가지고 num_labels 갯수만큼 반복한다. fmincg는 최적의 parameter 를 찾아줄것이고 1x401 크기의 결과()를 줄 것이다. feature가 401개 였기 때문에 그에 상응하는 parameter(weight)의 갯수도 401개. 결과는 단지 all_theta에 반복 횟수만큼 row가 추가되는것. 이 결과 all_theta를 가지고 predict 할것이다.

predictOneVsAll.m

function p = predictOneVsAll(all_theta, X)  
...(중략)  

gx = sigmoid(X * all_theta');  
[max_pobability_one_example, class_in_one_example] = max(gx, [], 2);  
p = class_in_one_example;

X : 5000 X 401
all_theta : 10 X 401
gx : 5000 X 10
matrix gx의 각 row의 의미: 한 training set의 가설함수 의 결과가 0~9 순서로 10개 저장되어있다. 해당 training set이 0~9 숫자일확률이 각각 들어있다.
max(gx, [], 2); 를 하면 첫번째 결과물은 해당 row의 max 값이고 두번째는 그 max값의 index를 리턴한다. 그게 최종 우리의 예측 값.

results matching ""

    No results matching ""