脊回归:当训练样本增加时(从欠定到超定),测试误差随后上升然后下降

时间:2015-01-05 11:53:49

标签: matlab statistics regression linear-regression regularized

我正在研究训练样本大小在进行脊(正则化)回归时的效果。 当我绘制测试误差与列车集大小时,我得到了这个非常奇怪的图:plot

以下代码生成训练集和测试集,并对正则化参数的低值执行岭回归。

根据训练集的大小绘制误差及其标准偏差。

请注意,生成数据的维度为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的事实有关。它可能是计算的,因为随着训练集变大,测试误差当然会减少......

如果你们中的任何一个人能够了解正在发生的事情,我将不胜感激!

1 个答案:

答案 0 :(得分:0)

对于您的迭代过程,唯一的变化因素是您的样本范围(从8到12),这不应该影响您的结果,因为它只是一个范围。

我认为造成错误率巨大变化的原因是这个过程:     randn(样品尺寸); 你每次使用它时都看过这个过程的输出吗? randn是一个从正态分布生成的随机数,所以它可能会生成一些非常大的数字,这可能会弄乱你的结果(考虑到你的范围非常小)。

您可以尝试修改随机过程的分布,看看会发生什么。