n =50;
N=1000;
x=linspace(-3,3,n)';
X=linspace(-3,3,N)';
pix=pi*x;
y=sin(pix)./(pix)+0.1*x+0.2*randn(n,1);
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;
u = floor(m*[0:n-1]/n)+1;
u=u(randperm(n));
for hk = 1:length(hhs)
hh=hhs(hk);
k=exp(-xx/hh);
for i=1:m
ki=k(u~=i,:);
kc=k(u==i,:);
yi=y(u~=i);
yc=y(u==i);
for lk=1:length(ls)
l=ls(lk);
t=(ki'*ki+l*eye(n))\(ki'*yi);
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]);
plot(X,F,'g-');
plot(x,y,'bo');
n: 训练数据的节点数量。它定义了训练数据集中的数据点个数。
N: 测试数据的节点数量。它定义了测试数据集中的数据点个数。
x: 一个包含 n 个元素的列向量,表示训练数据的节点位置。通过 linspace 函数在-3到3的范围内生成,并均匀分布在该范围内。
X: 一个包含 N 个元素的列向量,表示测试数据的节点位置。通过 linspace 函数在-3到3的范围内生成,并均匀分布在该范围内。
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 计算得到的最终预测输出值。