Градиентный спуск MATLAB странно быстрее без нормализации - PullRequest
0 голосов
/ 04 июля 2018

Я реализую простую многомерную линейную регрессию в MATLAB. Моя реализация включает в себя нормализацию данных данных, которая по существу: для функции x(i), установите x(i) = (x(i) - μ)/σ, где μ и σ - среднее значение и диапазон, соответственно, каждого значения функции.

Я проверил время выполнения моего кода, и кажется, что всякий раз, когда я не применяю нормализацию функций, производительность намного выше. (Я пробовал это с несколькими различными наборами данных обучения.) Поскольку нормализация предназначена для ускорения кода, я был бы признателен за любую помощь, которая указала бы, что не так с моей реализацией.

function [Theta, cost] = linearRegression(Trainset, max_cost)
% LINEAR REGRESSION - Given trainset and desired maximum cost for linear
% model, use gradient descent to return optimized Theta and its cost.

%% INITIALIZATION
m = size(Trainset,1); n = size(Trainset,2)-1;
X = [ones(m,1), Trainset(:,1:n)]; % X = <Mx(N+1)>
Y = Trainset(:,n+1); % Y = <Mx1>
Theta = zeros(1, n+1); % Theta = <1x(N+1)>
alpha = optimizeAlpha(X, Y);

%% FEATURE NORMALIZATION
avg = mean(X(:,2:n+1)); rng = range(X(:,2:n+1));
X(:,2:n+1) = (X(:,2:n+1) - repmat(avg, [m,1]))./(repmat(rng, [m,1]));

%% METHODS
% J - Cost function (sum of squared errors)
% GD - A single step in gradient descent
J=@(X, Y, Theta) (1/2/m)*sum((X*Theta' - Y).^2);
GD=@(X, Y, Theta, alpha) Theta - (alpha/m)*(X*Theta' - Y)'*X;

%% APPLY GRADIENT DESCENT UNTIL CONVERGENCE
while (J(X, Y, Theta) > max_cost),
    Theta = GD(X, Y, Theta, alpha);
end

cost = J(X, Y, Theta);
end

(Примечание: optimizeAlpha - это вспомогательный метод, который я написал, чтобы выбрать относительно большую альфа-скорость обучения, которая все еще достаточно мала, чтобы обеспечить сходство градиентного спуска. Если вы считаете, что это имеет отношение к моей проблеме, я включите код для этого метода тоже.)

Большое спасибо!

...