过拟合实验
clear; clc; N = 10;%产生数据点的个数 M = 10;%拟合多项式的最高次数 %绘制随机产生的点,目标f是sin(2_pi_x),产生的点要加上高斯噪声 x = rand(10, 1);%产生10个服从(0,1)均匀分布的点 是一个列向量 这10个产生的点服从U(0,1) noise_sigma = 0.08;%噪声方差noise_sigma ^ 2 y = sin(2*pi*x)+randn(10,1)*noise_sigma;%randn产生服从N(0,1)的数据点 figure(1); axis([0 1 -2 2]);%横坐标[0,1],纵坐标[-2,2] plot(x,y,'b.'); %绘制[0,1]上的f(x) = sin(2_pi_x) x_r = (0:0.01:1); y_r = sin(2*pi*x_r); hold on; plot(x_r,y_r,'b'); %p_x 第i个元素表示x.^i p_x = []; for m=0:M p_x = [p_x, x.^m];%连接p_x与x.^m end %将p_x转置,这样i行表示x'的i次幂 p_x = p_x';%10x10 p_x %线性回归w的参数估计 w = pinv(p_x*p_x')*p_x*y;%10x1 figure(1) hold on x_cur = [0:0.01:1] y_cur = zeros(size(x_cur)) %注意w的下标从1开始 for m=0:M y_cur = y_cur + w(m+1)*(x_cur.^m); end axis([0,1,-2,2]) plot(x_cur,y_cur,'r')
反复执行,观察产生的函数图形分布,以及拟合的效果发现
当M很大的时候,拟合的很好但是,函数方差很大,直接乱飘
当M很小的时候,拟合不一定很精准,但是函数分布基本比较集中
也就是说,当模型复杂时候,函数方差很大,但是在训练集上函数偏差很小
当模型简单时候,函数方差小,但是在训练集合上偏差大