过拟合实验

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很小的时候,拟合不一定很精准,但是函数分布基本比较集中

也就是说,当模型复杂时候,函数方差很大,但是在训练集上函数偏差很小

当模型简单时候,函数方差小,但是在训练集合上偏差大

posted @ 2021-11-29 15:55  fanyuheng  阅读(115)  评论(0编辑  收藏  举报