我同意 Alexey Zaytsev 的回答(以及对该答案的讨论),即出于各种原因,在输出上也可以进行标准化。但是,我只想添加一个示例,说明为什么标准化输出很重要。
对输出进行标准化/标准化很重要的一个例子是对于小而嘈杂的输出值。下图通过一个非常简单的示例对其进行了说明。MATLAB 代码如下图。
蓝点代表来自 sin() 函数的噪声样本。橙色/红色圆圈代表预测的高斯过程值。
- 在顶部的子图中,幅度是统一的(有噪声)。
- 在第二个子图中,输出值已按 1e-5 缩放,我们可以看到高斯过程模型(使用默认设置)预测了一个常数模型。默认设置优化了噪声参数并且具有相当高的下限。
- 在第三个子图中,噪声参数设置为零且未优化。在这种情况下,模型过拟合。
- 第四个子图显示了标准化输出和适合该数据的模型。
- 在最后一个子图中,输出从标准化操作缩减(未缩减到原始值),并且预测值也被缩减。请注意,预测值是使用训练数据标准化的平均值和标准差进行缩放的。
function importance_normgp()
% small outputs
% data
x = 0:0.01:1; x = x(:);
xp = linspace(0.1, 0.9, length(x)); xp = xp(:);
% noise free model
y = sin(2*pi*x) + 5e-1*randn(length(x), 1);
% train and predict gp model
mdl = fitrgp(x, y);
yp = predict(mdl, xp);
figure
subplot(5, 1, 1)
plot(x, y, '.')
hold on
plot(xp, yp, 'o')
title('original problem')
%% make outputs small (below noise lower bound)
ym = y/1e5;
% train and predict gp model
mdlm = fitrgp(x, ym);
ypm = predict(mdlm, xp(:));
subplot(5, 1, 2)
plot(x, ym, '.')
hold on
plot(xp, ypm, 'o')
title('small outputs')
%% outputs small and set sigma = 0
% train and predict gp model
mdlm1 = fitrgp(x, ym, 'Sigma', 1e-12, 'ConstantSigma', true, 'SigmaLowerBound', eps);
ypm1 = predict(mdlm1, xp(:));
subplot(5, 1, 3)
plot(x, ym, '.')
hold on
plot(xp, ypm1, 'o')
title('small outputs and sigma = 0')
%% normalise/standardise
nu = mean(ym);
sigma = std(ym);
yms = (ym - nu)/sigma;
% train and predict gp model
mdlms = fitrgp(x, yms);
ypms = predict(mdlms, xp(:));
subplot(5, 1, 4)
plot(x, yms, '.')
hold on
plot(xp, ypms, 'o')
title('standardised outputs')
% rescale
ypms2 = ypms*sigma + nu;
subplot(5, 1, 5)
plot(x, ym, '.')
hold on
plot(xp, ypms2, 'o')
title('scaled predictions')
legend('true model', 'prediction', 'Location', 'best')
end