图解机器学习第二部分第四章——对使用高斯核模型的l2约束的最小二乘学习法进行交叉验证

%%
n =50;%50 个节点
N=1000;%1000 个节点
x=linspace(-3,3,n)';%在 -3 到 3 上找 50 个节点
X=linspace(-3,3,N)';%在 -3 到 3 上找 1000 个节点
pix=pi*x;% π * x
y=sin(pix)./(pix)+0.1*x+0.2*randn(n,1);%通过函数f(x) 得到 y。
%前期准备工作
x2 = x.^2;
xx = repmat(x2,1,n)+repmat(x2',n,1)-2*x*x';
hhs = 2 * [0.03 0.3 3].^2; % 带宽值。
ls = [0.0001 0.1 100];% 正则化参数
m = 5; % 分割集合数为 5
u = floor(m*[0:n-1]/n)+1; % 朝负无穷大方向取整
u=u(randperm(n)); % 把1到n这些数随机打乱得到的一个数字序列 随机选取某个集合数
%%
% 计算3 种带宽值,3 种正则化值和5个集合的泛化误差
for hk = 1:length(hhs) % 遍历 3 种带宽值
    hh=hhs(hk);
    k=exp(-xx/hh); % 高斯核模型
    for i=1:m % 遍历 5 个集合数
        % ~= 判断两侧表达式是否不相等,如果两个值比较,
        % 是不等于的,那么返回结果为真,是等于的,那么返回结果为假
        ki=k(u~=i,:); %用于从训练数据的高斯核矩阵 k 中选择与当前集合 i 不匹配的子集。
        kc=k(u==i,:); %找到是 i 的集合 
        yi=y(u~=i); % 在 y 中找到不是 i 的集合
        yc=y(u==i); % 在 y 种找到是 i 的集合
        for lk=1:length(ls) % 遍历 3 种正则化值 交叉验证
            l=ls(lk);
            t=(ki'*ki+l*eye(n))\(ki'*yi); % 对不是i的集合进行训练
            fc=kc*t; % 计算泛化误差
            g(hk,lk,i)=mean((fc-yc).^2);
        end 
    end
end
%%
[gl,ggl]=min(mean(g,3),[],2); %
[ghl,gghl]=min(gl);
L=ls(ggl(gghl)); %选取最优的正则化参数
HH=hhs(gghl);% 选取最优的带宽值

K=exp(-(repmat(X.^2,1,n)+repmat(x2',N,1)-2*X*x')/HH);
k=exp(-xx/HH);
t=(k^2+L*eye(n))\(k*y);
F=K*t;

%%
%画图
figure(1);
clf;
hold on;
axis([-2.8 2.8 -0.5 1.2]);% X 轴的范围是-2.8 ~ 2.8。Y 轴的范围是 -0.5 ~ 1.2
plot(X,F,'g-');
plot(x,y,'bo');





n: 训练数据的节点数量。它定义了训练数据集中的数据点个数。

N: 测试数据的节点数量。它定义了测试数据集中的数据点个数。

x: 一个包含 n 个元素的列向量,表示训练数据的节点位置。通过 linspace 函数在-33的范围内生成,并均匀分布在该范围内。

X: 一个包含 N 个元素的列向量,表示测试数据的节点位置。通过 linspace 函数在-33的范围内生成,并均匀分布在该范围内。

pix: 训练数据节点 x 与 π 相乘的结果。用于计算训练数据的目标值。

y: 通过函数 f(x) 得到的训练数据的目标值。在这里,函数 f(x) 是使用 sin(pix)./(pix) 计算的 sinc 函数,并添加了一些噪声项。

x2: 训练数据节点 x 的平方。用于计算高斯核矩阵。

xx: 训练数据节点 x 之间的差的平方矩阵。通过 repmat 函数生成,用于计算高斯核矩阵。

hh: 带宽参数,控制高斯核函数的宽度。在这里,它的值是 2 * 0.3^2,即 0.18。

l: 正则化参数,用于控制模型的复杂度。较大的值会增加正则化的影响,防止过拟合。在这里,它的值是 0.1。

k: 训练数据的高斯核矩阵。通过高斯核函数计算得到,衡量了训练数据之间的相似性。

K: 测试数据与训练数据的高斯核矩阵。通过高斯核函数计算得到,衡量了测试数据与训练数据之间的相似性。

t1: 使用最小二乘法计算得到的系数向量,不考虑正则化约束。

F1: 使用测试数据和系数向量 t1 计算得到的预测输出值。

t2: 使用带有L2正则化约束的最小二乘法计算得到的系数向量。

F2: 使用测试数据和系数向量 t2 计算得到的带有L2正则化约束的预测输出值。

m: 集合数,用于交叉验证。它定义了将数据集分成多少个集合。

u: 一个包含 n 个元素的列向量,用于交叉验证中将数据集划分为不同的集合。它的值根据 m 来确定。

g: 一个三维数组,用于存储不同带宽值、正则化参数和集合数的泛化误差。在交叉验证过程中计算得到。

gl: 每个带宽值对应的平均泛化误差。

ggl: 每个带宽值对应的最小平均泛化误差的索引。

ghl: 最小平均泛化误差对应的值。

gghl: 最小平均泛化误差对应的索引。

L: 最优的正则化参数,根据交叉验证结果选择。

HH: 最优的带宽值,根据交叉验证结果选择。

t: 使用最优的带宽值和正则化参数计算得到的最终系数向量。

F: 使用测试数据和最终系数向量 t 计算得到的最终预测输出值。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值