Я использую MATLAB для кодирования Регуляризованной логистической регрессии и использую Градиентный спуск для обнаружения параметров. Все основано на курсе машинного обучения Эндрю Нг. Я пытаюсь закодировать функцию стоимости из заметок / видео Эндрю. Я не совсем уверен, правильно ли я делаю.
Основная проблема в том, что ... если число итераций становится слишком большим, мои затраты, похоже, взрываются . Это происходит независимо от того, нормализую я или нет (все данные преобразуются в 0 - 1) Эта проблема также приводит к сокращению создаваемой границы решения (недостаточное соответствие?). Ниже приведены три образца результатов, которые были получены, где границы решения GD сравниваются с границами решения * Matlab fminunc
.
Как видно, стоимость возрастает при увеличении количества итераций. Может быть, я неправильно кодировал стоимость? Или действительно есть вероятность, что градиентный спуск может перескочить? Если это помогает, я предоставляю свой код. Код, который я использовал для расчета истории затрат:
costHistory(i) = (-1 * ( (1/m) * y'*log(h_x) + (1-y)'*log(1-h_x))) + ( (lambda/(2*m)) * sum(theta(2:end).^2) );
, на основе уравнения ниже:
Полный код приведен ниже. Обратите внимание, что в этом коде я также вызывал другие функции. Был бы признателен за любые указатели! :) Заранее спасибо!
% 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');