我正在研究训练样本大小在进行脊(正则化)回归时的效果。
当我绘制测试误差与列车集大小时,我得到了这个非常奇怪的图:。
以下代码生成训练集和测试集,并对正则化参数的低值执行岭回归。
根据训练集的大小绘制误差及其标准偏差。
请注意,生成数据的维度为10。
%settings
samplerange = 8:12;
maxiter = 100;
test = 300;
dimension = 10;
gamma = 10^-5;
rng(2);
figure(1);
error = zeros(maxiter,1);
for samples=samplerange
for iter=1:maxiter
% training data
a = randn(dimension,1);
xtrain = randn(samples,dimension);
ytrain = xtrain*a + randn(samples,1);
% test data
xtest = randn(test,dimension);
ytest = xtest*a + randn(test,1);
% ridge regression
afit = (xtrain'*xtrain+gamma*length(ytrain)*eye(dimension)) \ xtrain'*ytrain;
% test error
error(iter) = (ytest-xtest*afit)'*(ytest-xtest*afit) / length(ytest);
end
hold on;
errorbar(samples, mean(error), std(error), '.');
hold off;
end
mean(error)
我收到以下错误值:
14.0982
28.1679
201.4467
75.4921
16.2038
以及以下标准差:
39.3148
126.0627
756.4289
568.7223
65.9008
为什么它会上升然后下降?该值平均超过100次迭代,因此这不是偶然的。
我认为它与数据维度为10的事实有关。它可能是计算的,因为随着训练集变大,测试误差当然会减少......
如果你们中的任何一个人能够了解正在发生的事情,我将不胜感激!
答案 0 :(得分:0)
对于您的迭代过程,唯一的变化因素是您的样本范围(从8到12),这不应该影响您的结果,因为它只是一个范围。
我认为造成错误率巨大变化的原因是这个过程: randn(样品尺寸); 你每次使用它时都看过这个过程的输出吗? randn是一个从正态分布生成的随机数,所以它可能会生成一些非常大的数字,这可能会弄乱你的结果(考虑到你的范围非常小)。
您可以尝试修改随机过程的分布,看看会发生什么。