加权最小二乘学习法公式推导:
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.05*randn(n,1)%通过函数f(x) 得到 y。
% 计算设计矩阵
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
t=p\y; %这里原本公式应为 t=(p'*p)\p' *y 算是简化了计算。同时 p \ y 相当于矩阵 p 的逆 乘以 y。
F=P*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 定义了节点的数量,分别是 50 和 1000。
x 和 X 使用 linspace 函数在 -3 到 3 之间均匀生成节点。
pix 是 pi 与 x 的乘积。
y 是通过将 sin(pix) 除以 pix 并加上一些噪声得到的目标函数的值。
p 和 P 是设计矩阵,其中 p 是基于 x 的设计矩阵,而 P 是基于 X 的设计矩阵。
for 循环用于构建设计矩阵,根据正弦和余弦函数的不同频率对 x 和 X 进行编码。
t 是通过最小二乘法求解得到的参数向量,使用反斜杠运算符 \ 表示求解线性方程组 p * t = y。
F 是使用参数向量 t 对输入 X 进行预测得到的函数值。
figure(1) 创建一个新的图形窗口。
clf 清空当前图形窗口。
hold on 命令用于保持图形窗口的当前图形,并在其上绘制新的图形。
axis 函数设置坐标轴的范围。
plot(X, F, 'g-') 绘制拟合曲线,颜色为绿色。
plot(x, y, 'bo') 绘制原始数据点,颜色为蓝色的圆点。
通过这段代码,最小二乘学习法被用于拟合一个函数,并将结果绘制在图形窗口中,以展示数据拟合效果。
实现结果: