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)
p(:,1)=ones(n,1);
P(:,1)=ones(N,1);
for j=1:15
p(:,2*j)=sin(j/2*x);
p(:,2*j+1)=cos(j/2*x);
P(:,2*j)=sin(j/2*X);
P(:,2*j+1)=cos(j/2*X);
end
t1=p\y;
F1=P*t1;
t2=(p*diag([ones(1,11) zeros(1,20)]))\y;
F2 = P*t2;
figure(1);
clf;
hold on;
axis([-2.8 2.8 -0.5 1.2]);
plot(X,F1,'g-');
plot(X,F2,'r--');
plot(x,y,'bo');
legend('Ls','Subspace-Constrained Ls');
解释:
1、定义了 n 和 N 分别为节点的数量,分别为 50 和 1000。
2、使用 linspace 函数在范围 -3 到 3 之间生成 n 个节点,存储在 x 中。
3、计算 x 的每个元素与 π 的乘积,存储在 pix 中。
4、使用函数 sin(pix) ./ (pix) 计算每个 pix 元素的 sin(pix)/pix 的值,并添加噪声项 0.1 * x + 0.2 * randn(n, 1),得到目标值 y。
5、创建设计矩阵 p 和 P,其中 p 用于拟合训练数据,而 P 用于生成预测结果。
6、p(:, 1) 和 P(:, 1) 均为全 1 的列向量。
7、使用循环为每个奇数列索引 2*j 和对应的偶数列索引 2*j+1 填充 p 和 P,分别使用 sin 和 cos 函数对 x 和 X 进行变换。
8、使用最小二乘法计算参数向量 t1,其中 p \ y 等价于 (p' * p) \ p' * y,但采用了简化计算的形式。
9、使用约束条件对参数向量进行计算,其中 diag([ones(1,11) zeros(1,20)]) 生成一个对角矩阵,该矩阵前 11 个对角元素为 1,后面 20 个对角元素为 0,将其与 p 相乘并进行最小二乘计算,得到参数向量 t2。
10、分别使用参数向量 t1 和 t2 对输入 X 进行预测,得到结果向量 F1 和 F2。
11、创建一个图形窗口,并命名为 "figure(1)"。
12、使用 clf 清空当前图形窗口。
13、使用 hold on 保持图形窗口的当前图形,允许在其上绘制新的图形。
14、使用 axis 函数设置坐标轴的范围。
15、使用 plot 函数绘制预测结果 F1 和 F2,颜色分别为绿色实线和红色虚线。
16、使用 plot 函数绘制原始数据点 x 和 y,颜色为蓝色的圆点。
17、使用 legend 函数添加图例,分别为 "Ls" 和 "Subspace-Constrained Ls",对应两种拟合方式。