matlab练习程序(递推最小二乘)

一般的最小二乘通常是一次拿到全部的数据, 对所有数据进行统一优化计算得到模型系数。

递推最小二乘是以一种递推的方式计算最小二乘,每次使用最新的测量值,来不断更新模型系数。

递推公式如下:

公式中A和B为测量值,X为模型系数。

matlab代码如下:

clear all;
close all;
clc;

a=2;b=2;c=-3;d=1;e=2;f=30;              %原始系数
[x,y]=meshgrid(0:0.1:30);
z=a*x.^2+b*y.^2+c*x.*y+d*x+e*y +f;      %模型
mesh(x,y,z)
hold on;

%%准备数据
X=x(:);Y=y(:);Z=z(:);
p = randperm(90000,100);    %90000个点中随机选100个
X=X(p);Y=Y(p);Z=Z(p);
plot3(X,Y,Z,'ro')

%%正常最小二乘
A=[X.^2 Y.^2 X.*Y X Y ones(length(X),1)];
B=Z;
C=inv(A'*A)*A'*B;

%%递推最小二乘
figure;
plot3(X,Y,Z,'ro')
hold on;

P = eye(6)*1000;
X = zeros(6,1);
for i=1:length(A)
    A1 = A(i,:);   
    % P = inv(inv(P)+A1'*A1);
    P = P - P*A1'*A1*P/(1+A1*P*A1');
    X = X + P*A1'*(B(i) - A1*X);
end

%%画出RLS计算出的结果
a=X(1);b=X(2);c=X(3);d=X(4);e=X(5);f=X(6);   %拟合系数
[x,y]=meshgrid(0:0.1:30);
z=a*x.^2+b*y.^2+c*x.*y+d*x+e*y +f;                  %模型
mesh(x,y,z)

拟合结果:

从结果上看,递推最小二乘结果不如常规最小二乘精确。

不过其递推特性用在对速度更高要求的情况下也许会更好。

原文地址:https://www.cnblogs.com/tiandsp/p/14190747.html