我正在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
是我写的一种帮助方法,用于选择相对较大的学习率alpha,但仍足够小以确保梯度下降会收敛。如果您认为这与我的问题有关,那么我'还将包括该方法的代码。)
非常感谢!