1. 程式人生 > >最小二乘曲線擬合matlab實現

最小二乘曲線擬合matlab實現

clear;
close all;
%% sample
x_all = 0:0.1:10;
[y_truth_all,y_all]=unknown_model1(x_all);
N = length(x_all);
%use the first half for training
x = x_all(1:N/2);
y = y_all(1:N/2);
y_truth = y_truth_all(1:N/2);


plot(x,y_truth,'g-x','LineWidth',1.5);
hold on;
plot(x,y,'m-x','LineWidth',1.5);
legend('model truth','observation');
title('training');


%% curve fitting, try linear model
X = [x;ones(1,length(x))]';
Y = y';
lambda1 = (X'*X)\X'*Y; %最小二乘擬合 (least-square fitting)
% evaluate the esimated model
ye1 = X*lambda1;
hold on;
plot(x,ye1,'c-o','LineWidth',1.5);




%% curve fitting, try order-3 order polynomial
X = [x.^3;x.^2;x;ones(1,length(x))]';
Y = y';
lambda2 = (X'*X)\X'*Y;%最小二乘擬合

% evaluate the esimated model
ye2 = X*lambda2;
hold on;
plot(x,ye2,'r-o','LineWidth',1.5);




%% curve fitting, try order-5 order polynomial
X = [x.^5;x.^4;x.^3;x.^2;x;ones(1,length(x))]';
Y = y';
lambda3 = (X'*X)\X'*Y;%最小二乘擬合
% evaluate the esimated model
ye3 = X*lambda3;
hold on;
plot(x,ye3,'b-o','LineWidth',1.5);



%%
figure;
plot(x,y,'g-x',x,ye1,'c-o',x,ye2,'r-o',x,ye3,'b-o','LineWidth',1.5);
legend('model truth', 'order-1','order-3', 'order-5');

以上是訓練的程式碼。由圖可見,3階和5階與真實模型最為接近,一階的誤差較大。

下面根據估計的模型對未來未知的資料進行預測,比較各模型與真實模型的誤差大小
%% show future trends