一般的最小二乘通常是一次拿到全部的數據, 對所有數據進行統一優化計算得到模型系數。
遞推最小二乘是以一種遞推的方式計算最小二乘,每次使用最新的測量值,來不斷更新模型系數。
遞推公式如下:
公式中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)
擬合結果:
從結果上看,遞推最小二乘結果不如常規最小二乘精確。
不過其遞推特性用在對速度更高要求的情況下也許會更好。