Превышение градиентного спуска и увеличение затрат при использовании для регулярной логистической регрессии - PullRequest
1 голос
/ 12 апреля 2019

Я использую MATLAB для кодирования Регуляризованной логистической регрессии и использую Градиентный спуск для обнаружения параметров. Все основано на курсе машинного обучения Эндрю Нг. Я пытаюсь закодировать функцию стоимости из заметок / видео Эндрю. Я не совсем уверен, правильно ли я делаю.

Основная проблема в том, что ... если число итераций становится слишком большим, мои затраты, похоже, взрываются . Это происходит независимо от того, нормализую я или нет (все данные преобразуются в 0 - 1) Эта проблема также приводит к сокращению создаваемой границы решения (недостаточное соответствие?). Ниже приведены три образца результатов, которые были получены, где границы решения GD сравниваются с границами решения * Matlab fminunc.

Regularized GD vs. fminunc, along with the cost history (30K iterations) Regularized GD vs. fminunc, along with the cost history (70K iterations) Regularized GD vs. fminunc, along with the cost history (120K iterations)

Как видно, стоимость возрастает при увеличении количества итераций. Может быть, я неправильно кодировал стоимость? Или действительно есть вероятность, что градиентный спуск может перескочить? Если это помогает, я предоставляю свой код. Код, который я использовал для расчета истории затрат: costHistory(i) = (-1 * ( (1/m) * y'*log(h_x) + (1-y)'*log(1-h_x))) + ( (lambda/(2*m)) * sum(theta(2:end).^2) );, на основе уравнения ниже:

Regularized Cost Function for Logistic Regression

Полный код приведен ниже. Обратите внимание, что в этом коде я также вызывал другие функции. Был бы признателен за любые указатели! :) Заранее спасибо!

% REGULARIZED Logistic Regression with Gradient Descent
clc; clear all; close all;
dataset = load('ex2data2.txt');
x = dataset(:,1:end-1); y = dataset(:,end); m = length(y);

% Mapping the features (includes adding the intercept term)
x = mapFeature(x(:,1), x(:,2)); % Change to polynomial of the 6th degree

% Define the initial thetas. Same as the number of features, including
% the newly added intercept term (1s)
theta = zeros(size(x,2),1) + 0.05;
initial_theta = theta; % will be used later...

% Set lambda equals to 1
lambda = 1;
% calculate theta transpose x and also the hypothesis h_x
alpha = 0.005;
itr = 120000; % number of iterations set to 120K
for i = 1:itr
    ttrx = x * theta; % theta transpose x
    h_x = 1 ./ (1 + exp(-ttrx)); % sigmoid hypothesis
    error = h_x - y;
    % the gradient a.k.a. the derivative of J(\theta)
    for j = 1:length(theta)
        if j == 1
            gradientA(j,1) = 1/m * (error)' * x(:,j);
            theta(j) =  theta(j) - alpha * gradientA(j,1);
        else
            gradientA(j,1) = (1/m * (error)' * x(:,j)) - (lambda/m)*theta(j);
            theta(j) =  theta(j) - alpha * gradientA(j,1);
        end
    end

    costHistory(i) = (-1 * ( (1/m) * y'*log(h_x) + (1-y)'*log(1-h_x))) + ( (lambda/(2*m)) * sum(theta(2:end).^2) );
end

[cost, grad] = costFunctionReg(initial_theta, x, y, lambda);
%  Using MATLAB's built-in function fminunc to minimze the cost function
%  Set options for fminunc
options = optimset('GradObj', 'on', 'MaxIter', 500);
%  Run fminunc to obtain the optimal theta
%  This function will return theta and the cost
[thetafm, cost] = fminunc(@(t)(costFunctionReg(t, x, y, lambda)), initial_theta, options);

close all;
plotDecisionBoundary_git(theta, x, y); % based on GD
plotDecisionBoundary_git(thetafm, x, y); % based on fminunc

figure;
plot(1:itr, costHistory(:), '--r');
title('The cost history based on GD');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...